导航:首页 > 编程语言 > java多线程同步的方法

java多线程同步的方法

发布时间:2022-09-13 11:58:50

java中线程同步方法有哪些

JAVA中线程同步方法一般有以下三种:
1 wait方法:
该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
调用wait方法需要注意几点:
第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。
第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。
第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。
2 notify方法和notifyAll方法:
notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。
3 synchronized关键字:
第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。
第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code.... }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。

Ⅱ Java中线程怎么同步

1、使用线程类自带的join方法,将子线程加入到主线程,在子线程执行完之后,在执行主线程逻辑。

例如

[java]view plain

  • publicstaticvoidcallableDemo()

  • throwsInterruptedException

  • {

  • System.out.println("=========TestwithCallable=====");

  • List<Callable<Integer>>callList=newArrayList<Callable<Integer>>();

  • ExecutorServiceexec=Executors.newFixedThreadPool(2);

  • //采用匿名内部类实现

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker1doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做实际工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker2doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做实际工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • exec.invokeAll(callList);

  • exec.shutdown();

  • doSuperWork();

  • }

  • 5、这种过于恶心,只简单说一下方法,主线程创建一个线程List,将每个子线程保存到列表中,然后定期轮询列表中子线程状态,当所有线程都完成之后,再执行主线程逻辑
  • Ⅲ java多线程解决同步问题的几种方式,原理和代码

    在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。管道方法不建议使用。

    Ⅳ java多线程调用同步方法时,休眠后代码为什么执行不到

    1、java多线程调用同步方法时主程序或者后台服务Service程序两者必须有一个正在运行着,定时任务才会执行。
    2、自动执行的任务可以设置开启或关闭定时,检查任务的这一开关处于开启状态。
    3、源目录在定时的时间点如果没有变化,任务执行后不会留下日志,通过查看任务的最后执行时间确定任务到底执行了没有。
    4、执行失败和没有执行不是同一回事,如果是执行失败则要分析失败原因。这是java多线程调用同步方法时,休眠后代码执行不到的原因。

    Ⅳ java多线程有几种实现方法线程之间如何同步

    Java多线程有两种实现方式:一种是继承Thread类,另一种是实现Runable接口,大同小异,推荐后者,因为实现接口的话这个类还可以实现别的接口和继承一个类,灵活性好,若继承Thread类之后,就无法继承其他类了。
    至于实现同步,最简单的方法就是使用同步块,synchronized(){语句块}
    当多个线程同时访问到同步语句块时,会由一个线程先获得对象锁,获取对象锁的线程执行完毕之后,释放锁,其他线程再次竞争锁,一个一个通过,不存在两个以上线程同时执行同步语句块的情况。

    Ⅵ java语言中线程同步的方法有哪些

    答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

    Ⅶ Java 线程同步几种方式

    (1)同步方法:
    即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
    (2)同步代码块
    即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
    (3)使用特殊域变量(Volatile)实现线程同步
    a.volatile关键字为域变量的访问提供了一种免锁机制
    b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
    c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
    d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
    (4)使用重入锁实现线程同步
    在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。
    (5)使用局部变量实现线程同步

    Ⅷ Java线程同步的方法

    等待唤醒机制
    wait():让线程等待。将线程存储到一个线程池中。
    notify():唤醒被等待的线程。通常都唤醒线程池中的第一个。让被唤醒的线程处于临时阻塞状态。
    notifyAll(): 唤醒所有的等待线程。将线程池中的所有线程都唤醒,让它们从冻结状体转到临时阻塞状态.
    这三个方法用于操作线程,可是定义在了Object类中,为什么呢?
    因为,这三个方法在使用时,都需要定义在同步中,要明确这些方法所操作的线程所属于锁。
    简单说。在A锁被wait的线程,只能被A锁的notify方法唤醒。
    所以必须要表示wait notify方法所属的锁对象,而锁对象可以是任意的对象。
    可以被任意的对象调用的方法肯定定义在Object类中。
    注意:等待唤醒机制,通常都用在同步中,因为需要锁的支持。
    而且必须要明确wait notify 所作用的锁对象。

    JDK1.5后的锁

    在jdk1.5版本之后,
    出现了一些新的特性,将原理的线程进行了改良。
    在java.util.concurrent.locks包中提供了一个接口Lock。替代了synchronized。
    synchronized。使用的是锁操作是隐式的。
    Lock接口,使用的锁操作是显示的。
    由两个方法来完成:
    lock():获取锁。
    unlock():释放锁。
    还有一个对象,Condition.
    该对象的出现替代了Object中的wait notify notifyAll这些操作监视器的方法。
    替代后的方式:await signal signalAll.

    Ⅸ java 实现线程同步的方式有哪些

    实现同步机制有两个方法:
    1、同步代码块:
    synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。
    2、同步方法:
    public synchronized 数据返回类型 方法名(){}
    就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
    1,该类的对象可以被多个线程安全的访问。
    2,每个线程调用该对象的任意方法之后,都将得到正确的结果。
    3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。
    注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。
    实现同步机制注意以下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。
    1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。
    2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.

    Ⅹ java多线程有几种实现方法

    阅读全文

    与java多线程同步的方法相关的资料

    热点内容
    压缩因子定义 浏览:968
    cd命令进不了c盘怎么办 浏览:214
    药业公司招程序员吗 浏览:974
    毛选pdf 浏览:659
    linuxexecl函数 浏览:727
    程序员异地恋结果 浏览:374
    剖切的命令 浏览:229
    干什么可以赚钱开我的世界服务器 浏览:290
    php备案号 浏览:990
    php视频水印 浏览:167
    怎么追程序员的女生 浏览:487
    空调外压缩机电容 浏览:79
    怎么将安卓变成win 浏览:459
    手机文件管理在哪儿新建文件夹 浏览:724
    加密ts视频怎么合并 浏览:775
    php如何写app接口 浏览:804
    宇宙的琴弦pdf 浏览:396
    js项目提成计算器程序员 浏览:944
    pdf光子 浏览:834
    自拍软件文件夹名称大全 浏览:328