深入理解Java内存模型的学习笔记四(volatile)

查阅地址: 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类型的变量是一种比较轻量级的加锁方式,但不能对整段代码加锁
禁止重排序本质上不会强制要求指令执行必须有序,只是命令的执行具有了可见性(仅为个人理解,不知道对不对)

你可能感兴趣的:(java,jvm)