关键字volatile与关键字synchronized

来源:互联网 发布:sjf调度算法c语言 编辑:程序博客网 时间:2024/05/22 12:06

    关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。使用关键字volatile增加了实例变量在多个线程之间的可见性。但是volatile关键字最致命的缺点是不支持原子性。

   下面将关键字volatile和synchronized进行比较:

1)关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字在执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。

   2)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。

       3)volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据做同步。

       4)关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的多个线程之间访问资源的同步性。


     线程安全包含原子性和可见性两个方面,java的同步机制都是围绕这两个方面来确保线程安全的。

     关键字volatile主要使用的场合是在多个线程中可以感知实例变量被更改了,并且可以获得最新的值使用,也就是用多线程读取变量时可以获得最新值使用。

     关键字volatile提示线程每次从共享内存中读取变量,而不是从私有内存中读取,这样就保证了同步数据的可见性。

     关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法或某一个代码块。它包含两个特征:互斥性和可见性。同步synchronized不仅可以解决一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前所有的修改效果。

0 0