Java关键字Synchronized和Volatile的区别

  1. 关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK版本的升级,synchronized关键字在 执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。
  2. 多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。
  3. volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它将私有内存和公共内存中的数据做同步。
  4. 值得强调的是:关键字volatile解决的是变量在多个线程之间的可见性;而关键字synchronized解决的是多线程之间访问资源的同步性。

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


为什么说关键字volatile不能保证原子性呢,举个小例子来看看:
<pre>int i=0;
i++;
</pre>
i++的操作步骤分解如下:

  1. 从内存中取出i的值;
  2. 计算i的值;
  3. 将i的值写到内存中。
    假如在2步计算值的时候,另外一个线程也修改i的值,那么这个时候就会出现脏数据。解决的办法就是使用关键字synchronized。
    (未完待续)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容