1. 程式人生 > >Java併發包中共享鎖的實現原理

Java併發包中共享鎖的實現原理

共享鎖--用到共享鎖的有Semapore訊號量和ReadLock讀鎖

共享式獲取和獨佔式獲取最主要的區別就是:在同一時刻能否有多個執行緒同時獲取到同步狀態。

下面我們分析下原始碼:

我們以Semaphore為例。Semaphore是訊號量,---作用就是一個共享資源,他可以控制同時多少個執行緒同時訪問該資源。

【訊號量用於控制某個資源可被同時訪問的個數,訊號量維護一個許可集-----》訪問共享例項前,會阻塞每個執行緒的訪問,獲取到該許可之後才可以進入訪問】

如原始碼:

Semaphore---->acquire(permits)---------預設非公平獲取

如圖:

如果沒有獲取到,就會放到同步佇列裡;

tryAxquire():嘗試獲取共享鎖:


如果我們呼叫的是acquire()方法,當我們沒有獲取到許可的時候,我們就會將當前執行緒放到同步佇列中

下面的圖和上面的其實是一個,上面是響應中斷的,下面是不響應中斷的


doAcquireSharedInterruptibly實現如下:

不響應中斷的:


上圖並不響應中斷,截圖裡說的有點出入。希望注意。

上圖的doReleaseShared釋放:


---------------------------------------------------------------------------------------------------------------------------------------------------------------

這裡釋放並只需要將狀態減去相應的許可數值。