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