精华内容
下载资源
问答
  • Java 线程同步的方法

    2017-03-13 16:15:51
    Java同步的六种方法



    1. synchronized

        同步方法:public synchronized void save(){}

        注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类

        同步代码块:

        synchronized(object){ }

        注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 
        通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 

    2.使用特殊域变量(volatile)实现线程同步

        a.volatile关键字为域变量的访问提供了一种免锁机制, 
        b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新, 
        c.因此每次使用该域就要重新计算,而不是使用寄存器中的值 
        d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量 

    3.使用重入锁实现线程同步

        在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。 
        ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 
        它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力

        ReenreantLock类的常用方法有:

            ReentrantLock() : 创建一个ReentrantLock实例 
            lock() : 获得锁 
            unlock() : 释放锁 
        注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用 

      注:关于Lock对象和synchronized关键字的选择: 
            a.最好两个都不用,使用一种java.util.concurrent包提供的机制, 
                能够帮助用户处理所有与锁相关的代码。 
            b.如果synchronized关键字能满足用户的需求,就用synchronized,因为它能简化代码 
            c.如果需要更高级的功能,就用ReentrantLock类,此时要注意及时释放锁,否则会出现死锁,通常在finally代码释放锁 

    4.使用局部变量实现线程同步 
        如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 
        副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

     

        ThreadLocal 类的常用方法

        ThreadLocal() : 创建一个线程本地变量 
        get() : 返回此线程局部变量的当前线程副本中的值 
        initialValue() : 返回此线程局部变量的当前线程的"初始值" 
        set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

    5.使用阻塞队列实现线程同步

        BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。

        BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类
        1、ArrayBlockingQueue:一个由数组支持的有界阻塞队列,规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大     小.其所含的对象是以FIFO(先入先出)顺序排序的。

        2、LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若      不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的。

        3、PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函       数的Comparator决定的顺序。

       4、SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的


    6.使用原子变量实现线程同步

       需要使用线程同步的根本原因在于对普通变量的操作不是原子的。

       在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类使用该类可以简化线程同步。
       其中AtomicInteger 表可以用原子方式更新int的值,可用在应用程序中(如以原子方式增加的计数器),
       但不能用于替换Integer;可扩展Number,允许那些处理机遇数字类的工具和实用工具进行统一访问。
       AtomicInteger类常用方法:
       AtomicInteger(int initialValue) : 创建具有给定初始值的新的AtomicInteger
       addAddGet(int dalta) : 以原子方式将给定值与当前值相加
       get() : 获取当前值



    展开全文
  • java线程同步的方法

    2015-06-09 15:06:02
    1.wait():使一个线程处于等待状态,并且释放...3.notify():唤醒一个处于等待状态的线程,注意是在调用此方法的时候, 并不能确切唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且 不是按优先级;

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

    2.sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方

    法要捕捉 InterruptedException 异常;

    3.notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,

    并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且

    不是按优先级;

    4.notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一

    个对象的锁,而是让它们竞争。

    展开全文
  • java 线程同步的方法

    2014-09-22 18:55:13
    原子操作:由一组相关操作完成,这些操作可能会操纵与其它的线程共享资源,为了保证得到正确运算结果,一个线程在执行原子操作其间,应该采取其他措施使得其他的线程不能操纵共享资源。原子操作:根据Java...
    原子操作:由一组相关的操作完成,这些操作可能会操纵与其它的线程共享的资源,为了保证得到正确的运算结果,一个线程在执行原子操作其间,应该采取其他的措施使得其他的线程不能操纵共享资源。
    原子操作:根据Java规范,对于基本类型的赋值或者返回值操作,是原子操作。但这里的基本数据类型不包括long和double, 因为JVM看到的基本存储单位是32位,而long 和double都要用64位来表示。所以无法在一个时钟周期内完成。
    自增操作(++)不是原子操作,因为它涉及到一次读和一次写

    同步代码块:为了保证每个线程能够正常执行原子操作,Java引入了同步机制,具体的做法是在代表原子操作的程序代码前加上synchronized标记,这样的代码被称为同步代码块。

    同步锁:每个JAVA对象都有且只有一个同步锁,在任何时刻,最多只允许一个线程拥有这把锁。

    当一个线程试图访问带有synchronized(this)标记的代码块时,必须获得 this关键字引用的对象的锁,在以下的两种情况下,本线程有着不同的命运。
    1、 假如这个锁已经被其它的线程占用,JVM就会把这个线程放到本对象的锁池中。本线程进入阻塞状态。锁池中可能有很多的线程,等到其他的线程释放了锁,JVM就会从锁池中随机取出一个线程,使这个线程拥有锁,并且转到就绪状态。
    2、 假如这个锁没有被其他线程占用,本线程会获得这把锁,开始执行同步代码块。 (一般情况下在执行同步代码块时不会释放同步锁,但也有特殊情况会释放对象锁 如在执行同步代码块时,遇到异常而导致线程终止,锁会被释放;在执行代码块时,执行了锁所属对象的wait()方法,这个线程会释放对象锁,进入对象的等 待池中)

    线程同步的特征:
    1、 如果一个同步代码块和非同步代码块同时操作共享资源,仍然会造成对共享资源的竞争。因为当一个线程执行一个对象的同步代码块时,其他的线程仍然可以执行对 象的非同步代码块。(所谓的线程之间保持同步,是指不同的线程在执行同一个对象的同步代码块时,因为要获得对象的同步锁而互相牵制)
    2、 每个对象都有唯一的同步锁
    3、 在静态方法前面可以使用synchronized修饰符。
    4、 当一个线程开始执行同步代码块时,并不意味着必须以不间断的方式运行,进入同步代码块的线程可以执行Thread.sleep()或执行Thread.yield()方法,此时它并不释放对象锁,只是把运行的机会让给其他的线程。
    5、 Synchronized声明不会被继承,如果一个用synchronized修饰的方法被子类覆盖,那么子类中这个方法不在保持同步,除非用synchronized修饰。

    线程安全的类:
    1、 这个类的对象可以同时被多个线程安全的访问。
    2、 每个线程都能正常的执行原子操作,得到正确的结果。
    3、 在每个线程的原子操作都完成后,对象处于逻辑上合理的状态。

    释放对象的锁:
    1、 执行完同步代码块就会释放对象的锁
    2、 在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放
    3、 在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放对象锁,进入对象的等待池。

    死锁
    当一个线程等待由另一个线程持有的锁,而后者正在等待已被第一个线程持有的锁时,就会发生死锁。JVM不监测也不试图避免这种情况,因此保证不发生死锁就成了程序员的责任。

    如何避免死锁
    一个通用的经验法则是:当几个线程都要访问共享资源A、B、C 时,保证每个线程都按照同样的顺序去访问他们。

    线程通信
    Java.lang.Object类中提供了两个用于线程通信的方法
    1、 wait():执行了该方法的线程释放对象的锁,JVM会把该线程放到对象的等待池中。该线程等待其它线程唤醒
    2、 notify():执行该方法的线程唤醒在对象的等待池中等待的一个线程,JVM从对象的等待池中随机选择一个线程,把它转到对象的锁池中。
    展开全文
  • Java线程同步的方法

    2010-10-28 10:18:00
    1 wait方法:  该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll...

    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非常经济。

    展开全文
  • wait():使一个线程处于等待状态,并且...notify():唤醒一个处于等待状态的线程,注意是在调用此方法的时候,并不能确切唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 Allnotity
  • 展开全部线程同步62616964757a686964616fe4b893e5b19e31333365653330主要有以下种方法(示例中是实现计数功能):1、同步方法,即使用synchronized关键字修饰方法,例如:publicsynchronizedvoidadd(intc){...}2、...
  • Java线程同步方法

    2016-03-18 16:24:09
    Java线程同步方法java允许多线程并发控制,当多个线程同时操作一个可共享资源变量时(如数据增删改查),数据可能不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前(被释放),被其他线程...
  • java线程同步方法的实例 java线程同步方法的实例 java线程同步方法的实例
  • Java线程同步实现方法

    2016-10-26 19:45:43
    (1) synchronized修饰代码块,一个线程访问一个对象synchronized同步代码块时,其它试图访问该对象的线程将被阻塞,必须等待当前线程执行完这个代码块以后才能执行该代码块,但是另一个线程仍然可以访问该对象中...
  • java线程同步方法

    2018-07-10 21:57:05
    同步代码块 同步—高开销—减少同步内容3.wait和notify wait:线程处于等待,释放锁 sleep:线程睡眠,不释放锁 notify:随机唤醒某个处于等待的线程 notifyall:唤醒所有等待线程4.volatile—可见性,禁止指.....
  • synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类synchronized修饰具体的代码块同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized...
  • 下面属于java线程同步方法的方法

    千次阅读 2011-06-24 15:03:00
    下面属于java线程同步方法的方法有 A.joiny() B.run() C.wait() D.destroy()
  • java线程的同步方法

    2015-08-21 09:57:05
    java线程的同步方法有两种, synchronized(){} 和 wait(), notify(), notifyAll(), 但这两都是有区别和联系。[你可能还会想到sleep()方法] synchronized() 是用来获取资源锁, wait()是让当前线程进入等待状态...
  • JAVA线程同步方法和同步代码块

    千次阅读 2018-08-08 16:35:58
    JAVA 线程同步方法和同步代码块 线程安全和非线程安全 脏读 非线程安全:多个线程对同一个对象实例变量进行并发访问,产生后果就是脏读,也就是获取数据被更改。 非线程安全问题存在与“实例变量”中,...
  • JAVA线程同步的方法

    2015-02-10 17:21:57
    JAVA线程同步的方法 博客分类: Java   用什么关键字修饰同步方法 ? 用synchronized关键字修饰同步方法  同步有几种实现方法,都是什么?分别是synchronized,wait与notify wait():使一个线程处于...
  • Java 线程同步

    2019-12-23 14:51:03
    Java 线程同步 同步关键字:synchronized synchronized关键字使用 成员方法 语句块 例题: Java 线程同步 同步关键字:synchronized synchronized关键字使用 成员方法 语句块 例题: ...
  • java线程同步的7种方法

    千次阅读 2017-10-25 09:12:14
    为何要使用同步?   java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),   将会导致数据不准确,相互之间... 即有synchronized关键字修饰的方法。   由于java的每个
  • 实现Java线程同步的五种方法

    千次阅读 2017-03-29 01:16:09
    线程同步概念 Java允许多线程并发控制,当多个线程同时操作一个可共享资源变量时(如数据增删改查),将会导致数据不明确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程...
  • java线程同步的各种方法

    千次阅读 2013-10-17 21:20:50
    原子操作:由一组相关操作完成,这些操作可能会操纵与其它的线程共享资源,为了保证得到正确运算结果,一个线程在执行原子操作其间,应该采取其他措施使得其他的线程不能操纵共享资源。原子操作:根据Java...
  • Java线程同步的五种方法
  • Java线程:线程的同步-同步方法   线程的同步是保证多线程安全访问竞争资源一种手段。 线程的同步是Java多线程编程难点,往往开发者搞不清楚什么是竞争资源、什么时候需要考虑同步,怎么同步等等问题,当然,...
  • 总结:线程之间进行同步的方法--------用synchronized关键字保证原子性 账户实体类: 线程类:   测试类 2. 线程通信 法一:synchronized关键字锁住共同操作对象的方法:(案例生产者,消费者...
  • 同步的实现方法有五种:1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步JAVA多线程有哪几种实现方式JAVA多线程实现方式主要有三种:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,853
精华内容 7,941
关键字:

java线程同步的方法

java 订阅