Java中的鎖之樂觀鎖與悲觀鎖

布林bl發表於2018-12-20

1、 分類一:樂觀鎖與悲觀鎖

  a)悲觀鎖:認為其他執行緒會干擾本身執行緒操作,所以加鎖

                    i.具體表現形式:synchronized關鍵字和lock實現類
複製程式碼

  b)樂觀鎖:認為沒有其他執行緒會影響本身執行緒操作,所以不加鎖

                    i.具體表現形式:java的原子類的遞增操作

                   ii.原理:採用cas演算法
複製程式碼

  c)Cas演算法:交換與比較

                    i.涉及三個數:需要讀寫的記憶體值V,進行比較的值A,要寫入的新值B

                   ii.具體操作:若A=V,就用B更新V,否則不進行任何操作

                  iii.會用ABA問題:cas演算法需要判斷記憶體值V是否發生變化,如果a值變成b值然後又變回a值,cas演算法就會無法判斷,產生錯誤。解決上問題:在變數前新增版本號,將aba變成1a2b3c

                   iv.迴圈時間長開銷大,因為自旋需要消耗cpu

                    v.只能保證一個共享變數的原子操作
複製程式碼

2、 分類二

  a) 重入鎖:支援重進入的鎖,排它鎖

3、 分類三

  a)讀寫鎖:一對鎖,讀鎖,寫鎖,在同一時刻允許多執行緒訪問

相關文章