volatile不保證原子性

2021-09-29 20:48:26 字數 1059 閱讀 6270

1.什麼是原子性?

不可分割、完整性,即某個執行緒正在做某個具體業務時,中間不可以被加塞或者被分割,需要整體完整,要麼同時成功,要麼同時失敗

2.寫乙個demo來驗證volatile不保證原子性

/*

大概率結果不是2000

因為i++不是一步操作,而不是一步操作,所以無法保證原子性

*/class source

}public class test ,string.valueof(i)).start();

}//代替睡眠時間,目的是讓所有的執行緒都跑完

while(thread.activecount()>2)

system.out.println("最終的id值:"+s.id);

}}

分析:

<1>執行緒a讀取了i的變數的值,這個時候執行緒切換到了b,執行緒b同樣從主記憶體中讀取i的值,由於執行緒a沒有對i做過任何修改,此時執行緒b獲取到的i仍然是100。

<2>執行緒b工作記憶體中為i執行了加1的操作,但是沒有重新整理到主記憶體中(只要不刷到主存,就不能保證可見性),這個時候又切換到了a執行緒,a執行緒直接對工作記憶體中的100進行加1運輸(因為a執行緒已經讀取過i的值了),由於執行緒b並未寫入i的最新值,這個時候a執行緒的工記憶體中的100不會失效。

<3>最後,執行緒a將i=101寫入主記憶體中,執行緒b也將i=101寫入主記憶體中,這時本該是兩次操作就成了一次

3.解決方案:使用atomicinteger

//最終的結果是2000

class source

}public class ss ,string.valueof(i)).start();

}//代替睡眠時間,目的是讓所有的執行緒都跑完

while(thread.activecount()>2)

system.out.println("最終的id值:"+s.num);

}}

為什麼要使用atomicinteger?因為volatile不能保證原子性

volatile是怎樣保證原子性的?利用cas

cas又是怎樣保證原子性的?

volatile不能保證原子性

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

volatile能保證原子性嗎?

volatile不能保證原子性。當跟自增操作一起時,自增操作本身不是原子性操作。class data public class main string.valueof i start while thread.activecount 2 system.out.println data.number ...

為什麼volatile不能保證原子性

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