可重入鎖 讀寫鎖

2021-10-10 11:20:45 字數 1765 閱讀 6140

reentrantlock:重入鎖。表示該鎖能夠支援乙個執行緒對資源的重複加鎖.任意執行緒在獲取到鎖之後能夠再次獲取該所而不會被鎖阻塞。

之前寫的mutex是乙個不支援的重入的獨佔鎖。

實現可重入

執行緒再次加鎖:鎖需要去識別獲取鎖的執行緒是否為當前佔據鎖的執行緒,如果是,則再次獲取。

鎖的最終釋放:執行緒重複n此獲取了鎖,隨後在第n次釋放該鎖後,其他執行緒能夠獲取到該鎖。鎖的最終釋放要求鎖對於獲取進行計數增加,計數表示當前鎖被重複獲取的次數,而被鎖釋放的時候,計數自減,當計數等於0的時候表示鎖已經成功釋放。

final boolean nonfairtryacquire(int acquires) 

}else if (current == getexclusiveownerthread())

return false;

}

檢視原始碼發現:通過判斷當前執行緒是否為獲取鎖的執行緒來決定操作是否成功,如果是獲取鎖的執行緒再次請求,則將同步值進行增加並返回true。表示獲取成功

成功獲取鎖的執行緒再次獲取鎖,只是增加了同步狀態值。

protected final boolean tryrelease(int releases) 

setstate(c);

return free;

}

如果該多被獲取了n次,那麼前n-1次tryrelease都返回false,只有同步狀態完全釋放(等於0)才可以返回true。

公平鎖

protected final boolean tryacquire(int acquires) 

}else if (current == getexclusiveownerthread())

return false;

}}

該方法與非公平鎖的區別:判斷條件加了hasqueuedpredecessors。即加入了同步佇列中當前節點是否有前驅結點的判斷。如果該方法返回true。說明之前有更早的執行緒請求獲取鎖,因此需要等待前驅執行緒獲取並釋放或才可以去獲取。

之前學的獨佔鎖可重入鎖都是排它鎖。這些鎖在同一時刻只允許乙個執行緒進行訪問,而讀寫鎖在同一時刻允許多個執行緒訪問,但是在寫執行緒訪問時,所有的讀操作和其他寫操作均被堵塞。

方法名稱

描述int getreadlockcount()

返回當前鎖被獲取的次數。該次數不等於獲取讀鎖的執行緒數,比如,僅乙個執行緒,它連續獲取了n次讀鎖,那麼佔據讀鎖的執行緒是1,但是該方法返回n。

int getreadholdcount()

返回當前執行緒獲取讀鎖的次數

boolean iswritelock

判斷寫鎖是否被獲取

int getwriteholdcount()

返回當前鎖被獲取的次數

讀寫鎖的使用

public class cache  finally 

}//設定key對應的value,並返回舊的value

public static final object put(string key, object value) finally

}//清空所有內容

public static final void clear() finally

}}

讀寫鎖 可重入鎖

讀寫鎖就是分了兩種情況,一種是讀時的鎖,一種是寫時的鎖,它允許多個執行緒同時讀共享變數,但是只允許乙個執行緒寫共享變數,當寫共享變數的時候也會阻塞讀的操作。這樣在讀的時候就不會互斥,提高讀的效率。可以用來讀寫快取,步驟 1 加讀鎖,從快取讀取key對應的value 2 若讀取到,則返回,並釋放讀鎖 ...

鎖 可重入鎖

reetrantlick相對於 synchronized 的優勢 reentrantlock獨有的能力 1.reentrantlock可以指定是公平鎖還是非公平鎖。而synchronized只能是非公平鎖。所謂的公平鎖就是先等待的執行緒先獲得鎖。2.reentrantlock提供了乙個conditi...

可重入鎖 不可重入鎖

可重入鎖指的是可重複可遞迴呼叫的鎖,在外層使用鎖之後,在內層仍然可以使用,並且不發生死鎖 前提是同乙個物件或者類 note reentrantlock和synchronized都是可重入鎖 1 public class testlock 78 public synchronized void tes...