1. 程式人生 > >ReentrantLock可重入鎖(不看後悔,看了必懂)

ReentrantLock可重入鎖(不看後悔,看了必懂)

ReentraantLock是通過一個FIFO的等待佇列來管理獲取該鎖所有執行緒的。在“公平鎖”的機制下,執行緒依次排隊獲取鎖(先等待的執行緒先獲得鎖);而“非公平鎖”在鎖是可獲取狀態時,不管自己是不是在佇列的開頭都會獲取鎖。 

ReentrantLock和synchronized的相同點

①ReentrantLock和synchronized一樣都具有可重入性

ReentrantLock和synchronized的不同點

①效能方面

在Synchronized優化以前,synchronized的效能是比ReenTrantLock差很多的,但是自從Synchronized引入了偏向鎖,輕量級鎖(自旋鎖)後,兩者的效能就差不多了,在兩種方法都可用的情況下,官方甚至建議使用synchronized

②使用時的區別

Synchronized的使用比較方便簡潔,並且由編譯器去保證鎖的加鎖和釋放,而ReenTrantLock需要手工宣告來加鎖和釋放鎖,為了避免忘記手工釋放鎖造成死鎖,所以最好在finally中宣告釋放鎖。所以鎖的細粒度和靈活度:很明顯ReenTrantLock優於Synchronized

③ReenTrantLock獨有的能力

(1)synchronized的鎖是非公平鎖。ReentrantLock預設情況下也是非公平鎖,但可以通過帶布林值的建構函式要求使用公平鎖。new RenentrantLock(boolean fair) 

(2)等待可中斷(等待可中斷是指當持有鎖的執行緒長期不釋放鎖的時候,正在等待的執行緒可以選擇放棄等待,改為處理其他事情。可等待特性對處理執行時間非常長的同步塊很有幫助。)

使用synchronized。如果Thread1不釋放,Thread2將一直等待,不能被中斷。使用ReentrantLock。如果Thread1不釋放,Thread2等待了很長時間以後,可以中斷等待,轉而去做別的事情。