- 关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK版本的升级,synchronized关键字在 执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。
- 多线程访问volatile不会发生阻塞,而synchronized会出现阻塞。
- volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它将私有内存和公共内存中的数据做同步。
- 值得强调的是:关键字volatile解决的是变量在多个线程之间的可见性;而关键字synchronized解决的是多线程之间访问资源的同步性。
线程安全包含原子性和可见性两个方面,Java的同步机制都是围绕这两个方面来确保线程安全的。
为什么说关键字volatile不能保证原子性呢,举个小例子来看看:
<pre>int i=0;
i++;
</pre>
i++的操作步骤分解如下:
- 从内存中取出i的值;
- 计算i的值;
- 将i的值写到内存中。
假如在2步计算值的时候,另外一个线程也修改i的值,那么这个时候就会出现脏数据。解决的办法就是使用关键字synchronized。
(未完待续)
网友评论