Volatile的特征:ide
A、禁止指令重排(有例外)
B、可见性spa
Volatile的内存语义:.net
当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。线程
当读一个volatile变量时,JMM会把线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量。orm
Volatile的重排序blog
一、当第二个操做为volatile写操作时,无论第一个操做是什么(普通读写或者volatile读写),都不能进行重排序。这个规则确保volatile写以前的全部操做都不会被重排序到volatile以后;排序
二、当第一个操做为volatile读操做时,无论第二个操做是什么,都不能进行重排序。这个规则确保volatile读以后的全部操做都不会被重排序到volatile以前;图片
三、当第一个操做是volatile写操做时,第二个操做是volatile读操做,不能进行重排序。内存
这个规则和前面两个规则一块儿构成了:两个volatile变量操做不可以进行重排序;it
除以上三种状况之外能够进行重排序。
好比:
一、第一个操做是普通变量读/写,第二个是volatile变量的读;
二、第一个操做是volatile变量的写,第二个是普通变量的读/写;
原文连接: http://blog.csdn.net/sinat_35512245/article/details/60325685