查阅地址:http://ifeve.com/java-memory-model-4/
volatile特性
1、
相当于对volatile共享变量做了同步
2、volatile变量的写对读具有可见性
3、
单个volatile变量具有原子性,但类似volatile++不具有可见性
volatile类型变量对内存可见性的影响
1、A
线程写volatile变量之前的所有变量,在B线程读同一个volatile变量后,会对B可见
volatile写读的内存语义
1、线程A写一个volatile变量时,实质上把写变量前的所有写从本地内存都刷新到主内存,相当于发了一条已经修改变量的消息
2、线程B读了一个volatile变量时,实质上从主内存读,更新本地内存,相当于发了一条接受了已修改变量的消息
3、线程A对一个volatile变量的写,随后线程B对此volatile变量读,相当于线程A对线程B发送消息
volatile语义的实现
1、在编译期间插入屏障来阻止某些重排序(详情请看原文)
为什么要增强volatile的语义
1、在旧的内存模型里,volatile语义较弱,允许volatile类型和普通类型变量的重排序,但为了让
单个volatile变量完全具有和锁同样功能,同样语义,所以在新的模型中,增强了volatile的语义
2、
volatile类型的变量是一种比较轻量级的加锁方式,但不能对整段代码加锁
禁止重排序本质上不会强制要求指令执行必须有序,只是命令的执行具有了可见性(仅为个人理解,不知道对不对)