多線程的鎖之悲觀鎖樂觀鎖的對比學習

悲觀鎖:讀取數據之前,假設會發生併發衝突,所以從一開始就爲了防止衝突,在獲取數據的時候進行加鎖,確保自己使用的過程中不會被修改,使用完成之後在進行鎖的釋放。典型的是Synchronized

樂觀鎖:假定不會發生數據衝突,所以獲取數據的時候不加鎖,但是在提交數據的時候,會判斷是否被修改過,如果被修改過則不進行數據更新,如果判斷沒被其他線程修改,則進行數據更新。樂觀鎖底層使用CAS無鎖機制實現的

CAS無鎖機制:
CAS:即Compare and Swap。比較再交換
包含三個參數,CAS(V,E,N):V表示要更新的變量,E表示預期值,N表示新值
V:代表主內存,
E表示本地內存的值,如果V= E 主內存的值與本地內存的值一直,證明沒有被修改過,可以直接寫入
如果V≠E,就要把主內存的值刷新到本地內存,然後在把本地值刷新到主內存中

CAS的缺點: 即ABA問題,如果主內存的值是A後來被改成B,但是又被改回去A,那麼很容易被誤認爲它沒有被修改過,
解決辦法:java併發包提供帶有標記的原子引用類 AtomicStampedReference,通過控制變量
version 值版本解決

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