volatile
volatile详解转载自:http://www.cnb
logs.com/dolphin0520/p/3920373.html
共享数据安全的三个特性:原子性,可见性,有序性。
当保证了以上三个特性时,多
线程并发并不会对数据造成影响。
volatile能保证可见性和有序性,但是不能保证原子性。因此在有volatile修饰变量的时,在多线程编程中,要考虑到保证整体变量的原子性,才能保证共享数据的
安全性。
question1:volatile的工作原理是什么?
观察加入volatile
关键字和没有加入volatile关键字时所生成的汇编代码
发现,加入volatile关键字时,会多出一个lock前缀指令。
1:volatile保证重排序。它确保指令重排序时不会把其后面的指令排到lock标记指令之前的位置,也不会把前面的指令排到其后面;即在执行到带lock前缀的这句指令时,在它前面的操作已经全部完成。
2:volatile保证可见性。它会强制将对缓存的修改操作立即写入主存,同时会将其他线程缓存行中内容标记为无效状态,因此其他线程操作变量时,必须重新从主
内存中读取变量的值。
question2:volation与synchronized的区别?
volitale与synchronized的区别:
1:volatile轻量级,只能修饰变量。
synchronized重量级,可以修饰方法和代码块。
2:volatile只能保证数据的可见性和有序性,不能用来保证原子性,因为多个线程并发访问volatile修饰的变量不会阻塞。(不能保证原子性:要么全部执行,要么都不执行)
synchronized不仅保证可见性,而且还保证原子性,因为,只有获得了锁的线程才能进入临界区,从而保证临界区中的所有语句都全部执行。多个线程争抢synchronized锁对象时,会出现阻塞。