【Java 多線程併發】Java 鎖(上)—— 樂觀鎖、悲觀鎖、自旋鎖

1.樂觀鎖

樂觀鎖是一種樂觀思想,即認爲讀多寫少,遇到併發寫的可能性低,每次去拿數據的時候都認爲別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,採取在寫時先讀出當前版本號,然後加鎖操作(比較跟上一次的版本號,如果一樣則更新),如果失敗則要重複讀-比較-寫的操作。

Java 中的樂觀鎖基本都是通過 CAS 操作實現的,CAS 是一種更新的原子操作,比較當前值跟傳入值是否一樣,一樣則更新,否則失敗

話外音:CAS,全稱 Compare And Swap(比較與交換),解決多線程並行情況下使用鎖造成性能耗損的一種機制。

實現思想 CAS(V,A,B),V 爲內存地址、A 爲預期原值,B 爲新值。

如果內存地址的值與預期原值相匹配,那麼將該位置值更新爲新值。

否則,說明已經被其他線程更新,處理器不做任何操作;無論哪種情況,它都會在 CAS 指令之前返回該位置的值。

而我們可以使用自旋鎖,循環 CAS,重新讀取該變量再嘗試再次修改該變量,也可以放棄操作。

CAS操作由處理器提供支持,是一種原語。原語是操作系統或計算機網絡用語範疇。

是由若干條指令組成的,用於完成一定功能的一個過程,具有不可分割性,即原語的執行必須是連續的,在執行過程中不允許被中斷。

如 Intel 處理器,比較並交換通過指令的 cmpxchg 系列實現。

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