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,這種中間狀態。但是宣告並賦...