文章目录
Long
,double
类型变量读写操作的原子性
volatile
仅仅能保证对其修饰的变量的写操作以及读操作本身的原子性,而这并不表示volatile变量的赋值操作一定具有原子性,例如,如下对volatile
修饰的变量count的赋值操作并不是原子操作:count++
count++
可以分为如下步骤count+1
count+1
的值赋值给count
count
是一个共享变量,那个该赋值操作实际上是一个read-modify-write
操作。其执行过程中其他线程可能已经更新了count
的值,因此该操作不具备不可分割性,也就不是原子操作。如果变量count是一个局部变量,那么该赋值操作就是一个原子操作。锁
来保证原子性了加载屏障
,能够刷新处理器缓存,使其读取的读取到的变量都是线程更新后的最新值。存储屏障
,能够冲刷处理器缓存,保证后续的线程读取到的值是最新的。volatile int flag=false
,其他线程会读取该状态作为执行某一个操作的依据volatile
,否则并不能保证对象
可见性