Java关键字Synchronized和Volatile的区别

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

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


为什么说关键字volatile不能保证原子性呢,举个小例子来看看:

int i=0;
i++;

i++的操作步骤分解如下:

  1. 从内存中取出i的值;
  2. 计算i的值;
  3. 将i的值写到内存中。
    假如在2步计算值的时候,另外一个线程也修改i的值,那么这个时候就会出现脏数据。解决的办法就是使用关键字synchronized。
    (未完待续)

你可能感兴趣的:(Java关键字Synchronized和Volatile的区别)