ReentrantReadWriteLock 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
一個支援 ReadWriteLock 與 類似 ReentrantLock語意的實作。
[Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)]
public class ReentrantReadWriteLock : Java.Lang.Object, IDisposable, Java.IO.ISerializable, Java.Util.Concurrent.Locks.IReadWriteLock
[<Android.Runtime.Register("java/util/concurrent/locks/ReentrantReadWriteLock", DoNotGenerateAcw=true)>]
type ReentrantReadWriteLock = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
interface IReadWriteLock
- 繼承
- 屬性
- 實作
備註
一個支援 ReadWriteLock 與 類似 ReentrantLock語意的實作。
此類別具有以下性質:
<ul><li><b>收購命令</b>
此類別不會針對鎖定存取施加讀取或寫入偏好排序。 不過,它支援一個可選 <的 em>公平</em> 政策。
<dl><dt><b>非公平模式(預設)</b><dd>當構造為非公平模式(預設)時,讀取與寫入鎖的進入順序未指定,受重入限制。 持續爭用的非公平鎖可能會無限期延後一個或多個讀寫執行緒,但通常吞吐量會高於公平鎖定。
<dt><b>公平模式</b><dd>當被構造為公平時,執行緒會以近似到達順序策略爭奪進入。 當目前持有的鎖定被釋放時,等待時間最長的單一寫入執行緒會被分配寫入鎖,或者如果有一組讀取執行緒比所有等待的寫入執行緒還久,該群組會被分配讀取鎖。
嘗試取得公平讀取鎖(非重入式)的執行緒,若寫入鎖被保留或有寫入執行緒等待,則會阻塞。 執行緒不會在目前最早等待的寫入執行緒取得並釋放寫入鎖後才會取得讀取鎖。 當然,如果等待的寫入者放棄等待,留下一個或多個讀取執行緒作為寫入鎖空著的等待者,則這些讀取執行緒會被分配讀取鎖。
嘗試取得公平寫入鎖(非重入)的執行緒,除非讀鎖和寫鎖皆空閒(這表示沒有等待執行緒),否則會阻塞。 (注意非阻塞 ReadLock#tryLock() 與 WriteLock#tryLock() 方法不遵守此公平設定,若可行,無論等待執行緒是否存在,都會立即取得鎖。) </dl>
<李><b>再入選</b>
此鎖允許讀取者與寫入者以 的樣式 ReentrantLock重新取得讀取或寫入鎖。 在所有寫入執行緒持有的寫入鎖都被釋放之前,不允許使用非重入式讀取器。
此外,寫入者可以取得讀取鎖,但反之則不行。 在其他應用中,當呼叫或回調執行讀取鎖的方法時,重入性非常有用。 如果讀取器嘗試取得寫入鎖,則永遠不會成功。
<li><b>鎖定降<級/b>
再進入也允許從寫鎖降級為讀鎖,方法是先取得寫入鎖,再取得讀取鎖,最後釋放寫入鎖。 然而,從讀取鎖升級到寫鎖是<>不可能<的>。
<li><b>中斷取得<鎖/b>
讀取鎖定與寫入鎖定都支援鎖定取得時的中斷。
<李><乙>Condition 支援</乙>
寫鎖定提供的Condition實作,其行為與 所提供的ConditionReentrantLock#newCondition實作在寫鎖ReentrantLock上相同。 當然,這 Condition 只能搭配寫入鎖定一起使用。
讀取鎖不支援 a Condition ,且 readLock().newCondition() 會拋 UnsupportedOperationException出 。
<li><b>配器/<b>
此類別支援判斷鎖是否被保留或爭用的方法。 這些方法設計用於監控系統狀態,而非同步控制。 </ul>
此類序列化的行為與內建鎖相同:解序列化鎖無論序列化時為何狀態,都會處於解鎖狀態。
<b>範例用法。</b> 這裡有一段程式碼草圖,示範如何在更新快取後執行鎖降級(例外處理在非巢狀處理多個鎖時特別棘手):
{@code
class CachedData {
Object data;
boolean cacheValid;
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
try {
// Recheck state because another thread might have
// acquired write lock and changed state before we did.
if (!cacheValid) {
data = ...;
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
} finally {
rwl.writeLock().unlock(); // Unlock write, still hold read
}
}
try {
use(data);
} finally {
rwl.readLock().unlock();
}
}
}}
ReentrantReadWriteLock 可用於某些類型集合的某些用途中改善並行性。 這通常只有在集合預期規模龐大、存取的讀取執行緒多於寫入執行緒,且操作開銷超過同步開銷時才有價值。 舉例來說,這裡有一個使用 TreeMap 的類別,預期它很大且同時可存取。
{@code
class RWDictionary {
private final Map<String, Data> m = new TreeMap<>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public List<String> allKeys() {
r.lock();
try { return new ArrayList<>(m.keySet()); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}}
<h2>實作說明</h2>
此鎖最多支援 65535 個遞迴寫入鎖與 65535 個讀取鎖。 試圖超越這些限制時,會被 Error 鎖定方式投擲。
已在1.5中新增。
的 java.util.concurrent.locks.ReentrantReadWriteLockJava 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
建構函式
| 名稱 | Description |
|---|---|
| ReentrantReadWriteLock() |
建立 |
| ReentrantReadWriteLock(Boolean) |
根據給定的公平原則創建新的 |
| ReentrantReadWriteLock(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| HasQueuedThreads |
查詢是否有執行緒正在等待取得讀鎖或寫鎖。 |
| IsFair |
如果該鎖的公平性設定為真,則回傳 |
| IsWriteLocked |
查詢寫入鎖定是否被任何執行緒持有。 |
| IsWriteLockedByCurrentThread |
查詢寫入鎖是否被當前執行緒持有。 |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
一個支援 |
| JniPeerMembers |
取得用於調用此 Java 節點成員的 JNI 元資料。 |
| Owner |
回傳目前擁有寫入鎖的執行緒,或 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| QueuedReaderThreads |
回傳一個包含可能等待取得讀取鎖的執行緒的集合。 |
| QueuedThreads |
回傳一個包含可能等待取得讀鎖或寫鎖的執行緒集合。 |
| QueuedWriterThreads |
回傳一個包含可能等待讀取寫入鎖的執行緒的集合。 |
| QueueLength |
回傳等待取得讀鎖或寫鎖的執行緒數量估計值。 |
| ReadHoldCount |
查詢目前執行緒對此鎖所保持的重入讀取次數。 |
| ReadLockCount |
查詢該鎖所擁有的讀取鎖數量。 |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| WriteHoldCount |
查詢該鎖在目前執行緒時所保持的重入寫入次數。 |
方法
| 名稱 | Description |
|---|---|
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
一個支援 |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
一個支援 |
| Equals(Object) |
一個支援 |
| Equals(Object) |
表示是否有其他物體「等同」於此物。 (繼承來源 Object) |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| GetWaitingThreads(ICondition) |
回傳一個集合,包含可能等待與寫入鎖相關條件的執行緒。 |
| GetWaitQueueLength(ICondition) |
回傳與寫鎖定相關條件等待執行緒數量的估計值。 |
| HasQueuedThread(Thread) |
查詢該執行緒是否正在等待取得讀取或寫入鎖定。 |
| HasWaiters(ICondition) |
查詢是否有執行緒正在等待與寫入鎖相關的條件。 |
| JavaFinalize() |
當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。 (繼承來源 Object) |
| Notify() |
喚醒一個正在該物件監視器上等待的執行緒。 (繼承來源 Object) |
| NotifyAll() |
喚醒所有等待該物件監視器的執行緒。 (繼承來源 Object) |
| ReadLock() |
還回用於閱讀的鎖。 |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
一個支援 |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
回傳物件的字串表示。 (繼承來源 Object) |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 Object) |
| Wait() |
導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。 (繼承來源 Object) |
| Wait(Int64, Int32) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| Wait(Int64) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| WriteLock() |
還原用於書寫的鎖。 |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
一個支援 |
| IJavaPeerable.Finalized() |
一個支援 |
| IJavaPeerable.JniObjectReferenceControlBlock |
一個支援 |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
一個支援 |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
一個支援 |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
一個支援 |
| IJavaPeerable.UnregisterFromRuntime() |
一個支援 |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
一個支援 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |