CAS
847
2025-03-31
常見的鎖的類型:
偏向鎖、自旋鎖、輕量級鎖、重量級鎖、獨占鎖、共享鎖、公平鎖、非公平鎖、可重入鎖、讀寫鎖。
樂觀鎖vs悲觀鎖:
樂觀鎖和悲觀鎖只是設計思想上的一個概念。
樂觀鎖:假設認為數據一般情況下不會產生并發沖突,所以在數據提交的時候才會去對數據檢查是否發生了并發沖突。(即在同一時間點只有一個線程對共享變量操作,所以適合樂觀的思想)
樂觀鎖的問題:并不總是能處理所有問題,所以會引入一定的系統復雜度。
悲觀鎖:總是假設最壞的情況,每次別人拿數據時都會產生并發沖突,都會去上鎖。(思想:同一時間點,經常有多個線程對共享變量操作,適合悲觀鎖)
悲觀鎖的問題:總是需要競爭鎖,進而導致發生線程切換,掛起其他線程;所以性能不高。
所以要使用哪種設計思想,應該根據不用的應用場景來決定。
基于樂觀鎖實現的機制:CAS機制,又稱無鎖操作;
CAS: Compare And Swap ,比較并交換
CAS(V,O,N)——>V:內存地址實際存放的實際值;O:預期的舊值; N:要賦值的新值。
可能出現的問題:ABA問題
CAS(V,O,N)中,當V==O時,N可以直接寫進V;當N!=O時,不能寫入,但當O ==N時,也可能時已經被其他線程修改過,但預期的舊值還是等于主存當時存的值,這就是ABA問題。
解決方案:增加版本號;
作用:每次修改后,版本號+1,通過版本號來觀察V是否被修改過。
總結:
1.悲觀鎖是線程先加鎖,后修改變量操作;
2.樂觀鎖是線程直接嘗試修改變量操作,在這個過程中不會發生線程阻塞;
3. CAS的實現原理:基于unsafe來實現,本質上是基于CPU提供的接口保證線程安全修改變量;
4. CAS在java中的應用:
自旋鎖:
無條件自旋
有條件自旋:如可中斷的自旋(自旋時可以使用線程判斷中斷標志位后再執行)
自旋+CAS的適用場景:同一時間點,常常只有一個線程操作。
不適用的場景:同一時間點,常常有很多線程操作。
自旋的缺陷:線程一直處于運行狀態,占用CPU內存,比較耗費資源。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。