JAVA面試——JAVA主流鎖

  • 樂觀鎖&悲觀鎖
    • 悲觀鎖:獲取數據時加鎖,(synchronized關鍵字、Lock實現類)
    • 樂觀鎖:使用數據時不加鎖,更新時判斷以前是否有其餘線程更新數據,(CAS算法)
      • CAS(Compare And Swap):
        • 無鎖算法,實現線程的變量同步
        • java.util.concurrent包中的原子類
        • 實現方法:
          • 須要讀寫的內存值V
          • 進行比較的A
          • 要寫入的新值B
        • 存在的問題:
          • ABA問題
          • 循環時間長、開銷大
          • 只能保證對一個共享變量的原子操做
  • 自旋鎖&適應性自旋鎖
    • 自旋鎖:
      • 同步資源鎖定時間短,避免線程切換致使的開銷,讓後面請求鎖的線程等待而進行自旋
      • 缺點:浪費處理器資源
    • 適應性自旋鎖:
      • 自旋時間不固定,根據同一個鎖上一次的等待時間和鎖擁有者運行狀態決定
      • 自旋不多成功,則阻塞線程
  • 無鎖&偏向鎖&輕量級鎖&重量級鎖
    • 針對synchronized的鎖狀態
    • 重量級鎖:依賴操做系統的Mutex Lock(互斥鎖)
    • 偏向鎖:一段同步代碼一直被一個線程所訪問,不存在線程競爭,自動獲取鎖,不經過CAS加解鎖
    • 輕量級鎖:當鎖是偏向鎖時,被其餘線程訪問時變成輕量級鎖,經過自旋的方式獲取鎖,不會阻塞
    • 總結:偏向鎖經過對比Mark Word解決加鎖問題,避免CAS操做;輕量級鎖經過CAS操做和自旋解決加鎖問題,避免線程阻塞;重量級鎖將其餘線程阻塞
  • 公平鎖&非公平鎖
    • 公平鎖:按照申請鎖的順序排隊獲取鎖,不會餓死,吞吐效率低
    • 非公平鎖:獲取鎖時獲取不到排隊,可用直接獲取,排隊線程可能餓死
  • 可重入鎖&非可重入鎖
    • 可重入鎖:
      • 同一個線程外層方法獲取鎖後,內層方法自動獲取鎖(ReentrantLock、synchronized)
    • 非可重入鎖:
      • 重複調用同步資源時會死鎖
  • 獨享鎖&共享鎖
    • 獨享鎖(互斥鎖、排他鎖)
      • 對數據A加鎖後,其餘線程不能對A加其餘類型的鎖,鎖一次只能被一個線程持有
      • synchronized、ReentrantLock
    • 共享鎖
      • 能夠被多個線程持有,多個線程能夠同時對A加共享鎖,共享鎖只讀不寫
      • ReentrantReadWriteLock
相關文章
相關標籤/搜索