volatile不能保證多執行緒復合操作的原子性

2021-10-09 09:35:51 字數 645 閱讀 9129

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 保證有序性 寫屏障保證指令重排序時,不會講寫屏障之...