JAVA併發編程梳理與學習五(原子操作CAS)

原子操作
1.什麼是原子操作?
一個操作一旦開啓就不會被打斷,一直到操作完成。類似於事務,要麼不執行,要執行就執行完,再去執行別的任務。
2.如何實現原子操作
(1)加鎖。synchronized關鍵字是基於阻塞的鎖機制,是一種悲觀鎖機制,就是一個線程一旦拿到了了鎖,別的線程只能等待。
這樣會有以下問題出現:
1》如果被阻塞的線程很重要優先級很高就可能出現問題
2》如果獲取鎖的線程要做大量運算比較耗時,那麼別的線程只能處於等待狀態
3》一旦一個線程拿到鎖,別的競爭鎖的線程可能被cpu調度出去,當鎖釋時,cpu再重新調度去競爭鎖,這樣就會浪費cpu資源
4》處理不好可能會出現死鎖
(2)CSA機制
**原理:**樂觀鎖機制。利用現代處理器都支持CAS指令,是CPU指令級的操作不是java程序裏面的操作。每一個CAS操作都包含內存地址V、期望值(原來值)A、新值(操作過後的值)B。
**具體過程:**先拿到舊值A存起來,然後操作A值得到B值,拿未操作過的舊值A和內存地址V存的值比較,如果相等,把內存地址V存的值替換爲B;如果不行等,繼續重複取值、改值、比較這一過程,知道成功爲止。
注意:
1.這是一個操作系統指令,操作系統已經做了處理,保證比較和替換這2個過程期間不會有別的線程去操作A值
2.不會出現死循環,因爲cpu操作指令事件很快很快
出現問題
1.ABA問題。如果只比較值,可能出現下面問題,假如線程A拿到原值爲1、改變值變爲2,再去比較時間,發生了線程B把值把該值由1->4->1,但是線程A比較是相等的,這中間其實是有別的線程操作的。
解決方案:加一個版本號
2.循環時間長cpu開銷大。上面說過如果不成功會以死循環方式重新操作,直到成功。
3.只能保證一個共享變量的原子操作
解決方案:把多個變量編成一個變量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章