volatile為什麼不能保證變數原子性

2021-10-07 16:24:02 字數 712 閱讀 5043

看個例子,僅是個人理解。 

public class volatiledemo 

}

當進行自增操作,位元組碼是這樣的

1、獲取變數的值併入棧

2、把1入棧

3、依次取出棧中兩個運算元相加併入棧(假設為臨時變數t)

4、取出棧頂值賦值給變數

而volatile的可見性指的是第4步,當修改變數後,把新值重新整理到記憶體,並使其他執行緒使用此變數的的快取行失效(多核處理器),那麼會重新讀取變數的值,即快取一致性;但是如果其他執行緒已經已經進行到了第3步,那麼意味著僅僅是重新讀了一遍新的變數值,會直接將已經計算好的t賦值給變數。

public class volatiledemo 

}

而當自增操作變成這樣的,位元組碼是這樣的

1、獲取a的值並壓入棧

2、取出棧頂元素賦值給count

這樣的話即使第一步被其他執行緒打斷,並且a的值被修改,那也是重新獲取一遍,並賦給count,不會存在安全問題。

所以看來volatile不會保證(i++)這樣復合操作的原子性。

為什麼volatile不能保證原子性

原子操作簡單來說,原子操作 atomic 就是不可分割的操作,在計算機中,就是指不會因為新城排程被打斷的操作。比如,簡單的賦值就是乙個原子操作 m 6 這是個原子操作假如m原先的值為0,那麼對於這個操作,要麼執行成功m程式設計了6,要麼沒執行m還是0,而不會出現諸如m 3,這種中間狀態。但是宣告並賦...

volatile為什麼不能保證原子性?

我們來看一下jmm是如何解釋的jmm規定了所有的變數都儲存在主記憶體 main memory 中,多個執行緒共享主記憶體中 的資料。每個執行緒都有自己的工作記憶體 working memory 執行緒的工作記憶體中保 存了該執行緒使用到的變數在主記憶體的副本拷貝,執行緒對變數的所有操作 讀取 賦 值...

volatile不能保證原子性

在討論原子性操作時,我們經常會聽到乙個說法 任意單個volatile變數的讀寫具有原子性,但是volatile 這種操作除外。所以問題就是 為什麼volatile 不是原子性的?因為它實際上是三個操作組成的乙個符合操作。首先獲取volatile變數的值 將該變數的值加1 將該volatile變數的值...