Java併發包中共享鎖的實現原理
阿新 • • 發佈:2019-01-02
共享鎖--用到共享鎖的有Semapore訊號量和ReadLock讀鎖
共享式獲取和獨佔式獲取最主要的區別就是:在同一時刻能否有多個執行緒同時獲取到同步狀態。
下面我們分析下原始碼:
我們以Semaphore為例。Semaphore是訊號量,---作用就是一個共享資源,他可以控制同時多少個執行緒同時訪問該資源。
【訊號量用於控制某個資源可被同時訪問的個數,訊號量維護一個許可集-----》訪問共享例項前,會阻塞每個執行緒的訪問,獲取到該許可之後才可以進入訪問】
如原始碼:
Semaphore---->acquire(permits)---------預設非公平獲取
如圖:
如果沒有獲取到,就會放到同步佇列裡;
tryAxquire():嘗試獲取共享鎖:
如果我們呼叫的是acquire()方法,當我們沒有獲取到許可的時候,我們就會將當前執行緒放到同步佇列中
下面的圖和上面的其實是一個,上面是響應中斷的,下面是不響應中斷的
doAcquireSharedInterruptibly實現如下:
不響應中斷的:
上圖並不響應中斷,截圖裡說的有點出入。希望注意。
上圖的doReleaseShared釋放:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
這裡釋放並只需要將狀態減去相應的許可數值。