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...