1. 程式人生 > 其它 >可重入的獨佔鎖ReentrantLock概述-公平與非公平鎖的實現

可重入的獨佔鎖ReentrantLock概述-公平與非公平鎖的實現

類圖概述

ReentrantLock是可重入的獨佔鎖,R最終還是AQS來實現的,根據引數決定內部是否為公平鎖。

其中Sync類繼承AQS,重寫了AQS提供的鉤子方法,比如tryAcquire方法。AQS的state狀態值標識執行緒獲取該鎖的次數。

非公平的實現

非公平是說先嚐試獲取鎖的執行緒不一定比後嘗試獲取鎖的執行緒優先獲取鎖。(人話:後嘗試的執行緒也可能拿到鎖)

實現過程:首先檢視state是否為0,為0代表空閒,嘗試CAS獲取該鎖,將state從0改為1,設定當前鎖的持有者為自己然後返回。

例子:執行緒A呼叫lock方法,執行到nonfairTryAcquire的程式碼,發現state不為0,發現當前執行緒不是執行緒持有者,則返回false,然後當前執行緒被放入AQS阻塞佇列。

這時執行緒B也呼叫了lock方法執行到nonfairTryAcquire,發現state為0了,B通過CAS獲取了鎖,這就是搶奪策略。

公平的實現

hasQueuedPredecessors方法是實現公平性的核心方法。

一句話概括:查詢是否有執行緒等待獲取的時間長於當前執行緒。

實現過程:如果當前執行緒節點有前驅結點則返回true,否則如果當前AQS佇列為空或者當前節點是AQS的第一個節點則返回false。(為什麼新來的執行緒還沒入隊就有前驅結點?這裡應該是在討論該節點已經入隊的情況,該執行緒入隊之後,通過查詢執行緒前面還有沒有前驅結點,來判斷他是否能公平的獲取鎖)。