1. 程式人生 > >4.顯式鎖 Lock

4.顯式鎖 Lock

ava 可重入鎖 trac 否則 隊列 ade 概念 允許 通過

4.1 概念

內置鎖 vs 顯示鎖

synchronize是java語言層面實現的鎖,稱為內置鎖。使用方便代碼簡潔,而且在jdk新版本優化後,性能也得到了很大的提高。synchronize是一個可重入鎖。而Lock是jdk提供開發者是用的一個顯式鎖。通過lock()和unlock()方法加鎖和釋放鎖。

可重入鎖 vs 不可重入鎖

可重入的意思是指持有鎖的線程在某種情況下,例如遞歸方式調用自身,此時不需要重新獲得所,而是給內部維護的一個state值加1,每次方法出棧後state值減1,直到state值為0,鎖被釋放。

公平鎖 vs 非公平鎖

公平鎖的含義是在並發環境,每個線程獲取鎖的時候,會先檢查鎖維護的線程等待隊列,如果等待隊列為空或者當前線程是等待隊列的第一個,就占有鎖,否則就會加入到等待隊列中,以後會按照FIFO的規則從隊列中取到自己;非公平鎖含義是在並發環境中,不理會等待隊列中是否有等待的線程獲取鎖,允許插隊,只要當前線程是available就可以占有鎖,如果嘗試失敗,就再采用類似公平鎖那種方式。ReentrantLock在創建的時候可以指定是公平鎖還是非公平鎖。不指定默認是非公平鎖。而且一般認為非公平鎖效率更好。

讀鎖 vs 寫鎖

讀寫鎖一般是指ReentrantReadWriteLock類,通過該類的內置類變量:readerLock和writeLock可以分別獲取讀鎖和寫鎖。其實ReadLock和WriteLock,從繼承關系可以看出,也是實現了Lock接口,也是顯示鎖的一種。在什麽情況下使用讀寫鎖呢?答案是讀多寫少的情況。

        /** Inner class providing readlock */
        private final ReentrantReadWriteLock.ReadLock readerLock;
        /** Inner class providing writelock */
        private final ReentrantReadWriteLock.WriteLock writerLock;
        

4.2 ReentrantLock源碼解讀

  • ReentrantLock實現了Lock接口,本身就是一個顯式鎖。
  • ReentrantLock內含一個Syn類,該類實現了AbstractQueuedSynchronizer.ReentrantLock是基於AQS實現的。

4.顯式鎖 Lock