- 可见性:
- 不保证原子性:
多线程环境下,数据计算和数据赋值的操作可能多次出现,即操作非原子。若数据在加载之后,若主内存count变量发生修改之后,由于线程工作内存中的值在此前已经加载,从而不会对变更操作做出相应变化,即私有内存和公共内存中变量不同步,进而导致数据不一致。
对于volatile变量,JVM只是保证从主内存加载到线程工作内存的值是最新的,也就是数据加载时是最新的。
由此可见,volatile解决的是变量读的可见性问题,但无法保证原子性,对于多线程修改共享变量的场景必须使用加锁同步。
- 有序性,禁止指令重排序:
重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段,有时候会改变程序语句的先后顺序。
不存在数据依赖关系,可以重排序。
存在数据依赖关系,禁止重排序。
数据依赖性:若两个操作访问同一变量,且这两个操作中有一个是写操作,此时两个操作间就存在数据依赖性。
volatile的底层实现是通过内存屏障