volatile實現原理:多處理器情況下,底層是通過JVM向處理器發送Lock前綴指令,Lock指令會讓處理器將緩存回寫到主存中去,並且使得其他處理器的緩存全部無效,也就是說,volatile可以讀到主存裏最新的值,即保證單個變量的可見性;除此之外,JVM還會發送load addl指令,load addl指令禁止指令重排,建立內存屏障,保證了內存指令操作的有序性。
關於可見性和原子性的看法:
volatile int i = 0;//多線程訪問,無論哪個線程訪問都能保證i = 0;這個是可見性。
i ++;
//1、讀i值;
//2、計算 i+1;
//3、將計算後的i值賦給i;
//多線程情況下,第一步讀的i值保證可見性和原子性;第二步和第三部,都無法保證原子性。
參考: