java 鎖總結

1.基於數據庫的樂觀鎖和悲觀鎖
有個版本字段,更新的時候先讀出來,更新的時候做爲where條件update。若是控制版本是狀態不是單向的話仍是有ABA的問題。單向的沒問題。
悲觀鎖在查詢的時候就把數據給鎖住。redis

2.基於jdk的樂觀鎖和悲觀鎖
synchronized是悲觀鎖,這種線程一旦獲得鎖,其餘須要鎖的線程就掛起的狀況就是悲觀鎖。
CAS操做的就是樂觀鎖,比較並替換。每次不加鎖而是假設沒有衝突而去完成某項操做,若是由於衝突失敗就重試,直到成功爲止。這種樂觀鎖的問題:ABA問題,若是一直再循環對cpu的開銷比較大。不能保證代碼塊的原子性 CAS機制所保證的只是一個變量的原子性操做,而不能保證整個代碼塊的原子性。數據庫

3.可重入鎖和非可重入鎖怎麼理解?
不可重入鎖:只判斷這個鎖有沒有被鎖上,只要被鎖上了,那麼不管當前申請鎖的是已獲取當前鎖的線程仍是未得到當前鎖的線程,通通必須等待,實現較爲簡單。
可重入鎖:不只判斷鎖有沒有被鎖上,還會判斷鎖是誰鎖上的,當上鎖的就是當前請求鎖的線程時,當前線程能夠再次訪問臨界資源,而且把加鎖次數加一。
設計了加鎖次數,以在解鎖的時候,能夠確保全部加鎖的過程都解鎖了,其餘線程才能訪問。否則沒有加鎖的參考值,也就不知道何時解鎖?解鎖多少次?才能保證本線程已經訪問完臨界資源了能夠喚醒其餘線程訪問了。實現相對複雜。
總結:這個可重入的概念就是,拿到鎖的線程能夠屢次以不用的方式再次訪問臨界資源而不出現死鎖的狀況。經典之處在於判斷了當前申請鎖的線程是不是加鎖的線程。若是是,則擁有重(chong)入的能力。異步

4.阻塞鎖和非阻塞鎖
阻塞就是要自旋。實現以下:spa

while (true){
      Boolen flag=獲取鎖;
      if(flag){
          break;
      }
  }

5.公平鎖和非公平鎖:公平鎖的意思是按照請求加鎖的順序得到鎖,非公平鎖就相反是無序的。這個通常來講實現的比較少。
6.redis鎖如何保證高可用?
須要自動續時,在獲取到鎖的時候異步開線程定時續。記錄線程的id
image.png線程

再釋放鎖的時候把這個線程id關閉掉。設計

7.談談你對cap理論的認識?
c:一致性 a:可用性 p:分區容錯性。redis屬於ap,就是一個節點寫成功了直接返回,沒有複製到各個節點上。zookeeper屬於cp,就是寫入一個數,各個節點都是寫一份同步完成才返回。
8.redis既然是ap,不是cp,若是寫入主節點就返回了,同步到從節點掛了,怎麼辦?讀的時候讀的從節點?這樣鎖就失效了。怎麼解決?
使用redisson中的紅鎖。通常不常常使用,有個前提條件須要多套主從配置,而後從機率上成功判斷。code

相關文章
相關標籤/搜索