public
class
test
public
static
void
main
(string[
] args);}
.start()
;}while
(thread.
activecount()
>1)
//保證前面的執行緒都執行完
thread.
yield()
; system.out.
println
(test.inc);}
}
程式可能會出現下面的現象:(我的理解是分為3個地方存資料,1.cpu棧頂,2.cpu快取記憶體,3.記憶體)
執行緒1執行緒2
1),讀取記憶體中(堆)的值
2),複製乙份到cpu快取記憶體
3),把值存到 執行緒棧(棧頂)
1),讀取記憶體中( 堆 )的值
2),複製乙份到cpu快取記憶體
3),把值存到執行緒棧(棧頂)
4),進行加1操作
5),寫入快取記憶體中並重新整理到記憶體中(此時會把執行緒1cpu的快取記憶體中的inc值設定為無效)
5),寫入快取記憶體中並重新整理到記憶體中
volatile不能保證原子性
在討論原子性操作時,我們經常會聽到乙個說法 任意單個volatile變數的讀寫具有原子性,但是volatile 這種操作除外。所以問題就是 為什麼volatile 不是原子性的?因為它實際上是三個操作組成的乙個符合操作。首先獲取volatile變數的值 將該變數的值加1 將該volatile變數的值...
多執行緒 volatile
目錄 1.volatile關鍵字的兩層含義 2.volatile關鍵字的原理和實現機制 3.volatile關鍵字的使用場景 4.volatile關鍵字與synchronized關鍵字的比較 1 保證了不同執行緒對這個變數進行操作的可見性。2 禁止進行指令重排序,能在一定程度上保持有序性。volat...
多執行緒 volatile
volatile主要用途 1 保證可見性 對volatile變數的寫指令後會加入寫屏障 寫屏障 在屏障之前的對共享變數的改動都同步到主存 對volatile變數的讀指令前會加入讀屏障 讀屏障 在該屏障之後對共享變數的讀取載入的都是主存中的新資料 2 保證有序性 寫屏障保證指令重排序時,不會講寫屏障之...