該類是乙個讀寫鎖的改進,它的思想是讀寫鎖中讀不僅不阻塞讀,同時也不應該阻塞寫。
讀不阻塞寫的實現思路:
在讀的時候如果發生了寫,則應當重讀而不是在讀的時候直接阻塞寫!
因為在讀執行緒非常多而寫執行緒比較少的情況下,寫執行緒可能發生飢餓現象,也就是因為大量的讀執行緒存在並且讀執行緒都阻塞寫執行緒,
因此寫執行緒可能幾乎很少被排程成功!當讀執行的時候另乙個執行緒執行了寫,則讀執行緒發現資料不一致則執行重讀即可。所以讀寫都存在的情況下,
使用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 具體命令類 具體命令類是抽象命令類的子類,實現了在抽象...