Java8對讀寫鎖的改進 StampedLock

2021-07-16 06:13:37 字數 1199 閱讀 5848

該類是乙個讀寫鎖的改進,它的思想是讀寫鎖中讀不僅不阻塞讀,同時也不應該阻塞寫。

讀不阻塞寫的實現思路:

在讀的時候如果發生了寫,則應當重讀而不是在讀的時候直接阻塞寫!

因為在讀執行緒非常多而寫執行緒比較少的情況下,寫執行緒可能發生飢餓現象,也就是因為大量的讀執行緒存在並且讀執行緒都阻塞寫執行緒,

因此寫執行緒可能幾乎很少被排程成功!當讀執行的時候另乙個執行緒執行了寫,則讀執行緒發現資料不一致則執行重讀即可。所以讀寫都存在的情況下,

使用stampedlock就可以實現一種無障礙操作,即讀寫之間不會阻塞對方,但是寫和寫之間還是阻塞的!

程式舉例:

public 

classpointfinally

}doubledistancefromorigin()finally}//

讀鎖驗證成功後才執行計算,即讀的時候沒有發生寫

returnmath.sqrt(

currentx

*currentx

+ currenty

*currenty

); }}

stampedlock的實現思想

在stampedlock中使用了clh

自旋鎖,如果發生了讀失敗,不立刻把讀執行緒掛起,鎖當中維護了乙個等待執行緒佇列。

所有申請鎖但是沒有成功的執行緒都會記錄到這個佇列中,每乙個節點(乙個節點表示乙個執行緒)儲存乙個標記位(locked),

用於判斷當前執行緒是否已經釋放鎖。當乙個未標記到佇列中的執行緒試圖獲得鎖時,會取得當前等待佇列尾部的節點作為其前序節點,

並使用類似如下**(乙個空的死迴圈)判斷前序節點是否已經成功的釋放了鎖:

while(pred.locked)   

解釋:pred表示當前試圖獲取鎖的執行緒的前序節點,如果前序節點沒有釋放鎖,則當前執行緒就執行該空迴圈並不斷判斷前序節點的鎖釋放,

即類似乙個自旋鎖的效果,避免被系統掛起。當迴圈一定次數後,前序節點還沒有釋放鎖,則當前執行緒就被掛起而不再自旋,

因為空的死迴圈執行太多次比掛起更消耗資源。

java 8多執行緒同步鎖

同步 塊的鎖物件是任意物件 object obj demo d 這些都行同步方法 把同步關鍵字synchronized新增到方法上,那麼,同步方法的鎖物件是同步方法是靜態方法,那麼這個靜態同步方法的鎖物件是 類的位元組碼檔案物件public class sellticket implements r...

JAVA8 對List分組同時排好序

public responsestatus findallfkrulebyfsid string fsid return responsestatus.object fkrulevolist 下面是groupingby的引數說明 可以看到有三個引數,第乙個引數就是key的function了,第二個引...

java8 對行為型模式下命令模式

命令模式 command pattern 是一種資料驅動的設計模式,它屬於行為型模式。請求以命令的形式包裹在物件中,並傳給呼叫物件。呼叫物件尋找可以處理該命令的合適的物件,並把該命令傳給相應的物件,該物件執行命令。concretecommand 具體命令類 具體命令類是抽象命令類的子類,實現了在抽象...