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

- 非可重入鎖:
- 獨享鎖&共享鎖
- 獨享鎖(互斥鎖、排他鎖)
- 對數據A加鎖後,其餘線程不能對A加其餘類型的鎖,鎖一次只能被一個線程持有
- synchronized、ReentrantLock
- 共享鎖
- 能夠被多個線程持有,多個線程能夠同時對A加共享鎖,共享鎖只讀不寫
- ReentrantReadWriteLock
歡迎關注本站公眾號,獲取更多信息