StampedLock 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
一種基於能力的鎖,具有三種模式用於控制讀寫存取。
[Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)]
public class StampedLock : Java.Lang.Object, IDisposable, Java.IO.ISerializable
[<Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)>]
type StampedLock = class
inherit Object
interface ISerializable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 繼承
- 屬性
- 實作
備註
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 StampedLock 的狀態包含一個版本與模式。 鎖取得方法回傳一個印記,代表並控制鎖定狀態的存取;這些方法的「try」版本可能會回傳特殊值 0,代表無法取得存取權。 解鎖與轉換方法需要標記作為參數,若與鎖狀態不符則失敗。 這三種模式是:
<UL>
<李><乙>寫作。</b> 方法 #writeLock 可能會阻擋等待獨佔存取,回傳一個印 #unlockWrite 章,可用於方法中解鎖鎖。 同時也提供無計時及限時版本 tryWriteLock 。 當鎖定處於寫入模式時,可能無法取得讀取鎖,且所有樂觀的讀取驗證都會失敗。
<李><B>雷丁。</b> 方法 #readLock 可能會阻擋等待非獨占存取的存取,回傳一個印 #unlockRead 章,可用於方法中解鎖鎖。 同時也提供無計時及限時版本 tryReadLock 。
<li><b>樂觀閱讀。</b> 方法 #tryOptimisticRead 僅在鎖目前未處於寫入模式時回傳非零印記。 若自取得給定印記後,寫入模式下未取得鎖,則方法 #validate 會返回為真,此時在最近一次寫入鎖釋放前的所有動作都發生於呼叫 之後 tryOptimisticRead的動作。 此模式可視為極弱版本的讀鎖,寫入者隨時可能破解。 對於短的唯讀程式碼段使用樂觀讀取模式,通常能減少爭用並提升吞吐量。 然而,其使用本質上是脆弱的。 樂觀讀取區塊應僅讀取欄位,並將其存放在本地變數中,供驗證後後續使用。 在樂觀讀取模式下讀取的欄位可能極度不一致,因此只有在你對資料表示法足夠熟悉、能檢查一致性和/或反覆呼叫方法 validate()時才會使用。 例如,這些步驟通常在先讀取物件或陣列參考,然後存取其欄位、元素或方法時所要求。
</ul>
此類別也支援在三種模式間有條件地進行轉換的方法。 例如,方法 #tryConvertToWriteLock 嘗試「升級」一個模式,當(1)已處於寫入模式,(2)處於讀取模式且沒有其他讀取器,或(3)處於樂觀讀取模式且鎖定可用時,該標記會回傳有效的寫入印記。 這些方法的形式旨在幫助減少重試設計中可能出現的程式碼臃腫。
StampedLock 設計用於開發螺紋安全元件的內部工具。 其使用依賴於對所保護資料、物件與方法內部特性的了解。 它們不會再入,因此鎖定的機構不應呼叫其他未知方法來重新取得鎖(雖然你可以將印章傳給其他能使用或轉換的方法)。 讀取鎖定模式的使用依賴於相關的程式碼區段無副作用。 未經驗證的樂觀讀取段落無法呼叫無法容忍潛在不一致的方法。 郵票使用有限的表示法,且不具密碼學安全性(即有效郵票可能可被猜測)。 郵票價值可在連續營運滿一年後回收。 未經使用或驗證超過此期限的郵票,可能無法正確驗證。 StampedLock 可序列化,但始終會反序列化為初始解鎖狀態,因此對遠端鎖定並不有用。
與 java.util.concurrent.Semaphore Semaphore,但不同的 Lock 是,StampedLock 沒有所有權的概念。 在一個執行緒中獲得的鎖可以在另一個執行緒中釋放或轉換。
StampedLock 的排程政策並不總是偏好讀者而非作者,反之亦然。 所有「嘗試」方法皆為盡力而為,不一定符合任何排程或公平政策。 任何「嘗試」方法取得或轉換鎖的零回傳,都不包含鎖狀態的任何資訊;後續的召喚可能會成功。
由於支援多種鎖定模式間的協調使用,此類別不會直接實作 Lock OR ReadWriteLock 介面。 然而,印章鎖可以被查看,#asReadLock()或#asWriteLock()在僅需相關功能集合的應用中。#asReadWriteLock()
<b>記憶體同步。</b> 在任何模式下成功鎖定的方法,具有與 <em>Lock</em> 動作相同的記憶體同步效果,詳見 cite<Java 語言規範>/cite< 第17>章。 在寫入模式下成功解鎖的方法,具有與 <em>Unlock</em> 動作相同的記憶體同步效果。 在樂觀讀取使用中,最近一次寫入模式解鎖動作之前的動作必定會發生——只有當後續驗證回真時,才會發生在 tryOptimisticRead 之後的動作之前;否則無法保證 tryOptimisticRead 與 valid 之間的讀取會獲得一致的快照。
<b>範例使用。</b> 以下說明了在維持簡單二維點的類別中的一些用法慣用法。 範例程式碼展示了一些嘗試/捕捉慣例,儘管此處不一定需要,因為它們的主體中不會發生例外。
{@code
class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
// an exclusively locked method
void move(double deltaX, double deltaY) {
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
// a read-only method
// upgrade from optimistic read to read lock
double distanceFromOrigin() {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.readLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
return Math.hypot(currentX, currentY);
}
} finally {
if (StampedLock.isReadLockStamp(stamp))
sl.unlockRead(stamp);
}
}
// upgrade from optimistic read to write lock
void moveIfAtOrigin(double newX, double newY) {
long stamp = sl.tryOptimisticRead();
try {
retryHoldingLock: for (;; stamp = sl.writeLock()) {
if (stamp == 0L)
continue retryHoldingLock;
// possibly racy reads
double currentX = x;
double currentY = y;
if (!sl.validate(stamp))
continue retryHoldingLock;
if (currentX != 0.0 || currentY != 0.0)
break;
stamp = sl.tryConvertToWriteLock(stamp);
if (stamp == 0L)
continue retryHoldingLock;
// exclusive access
x = newX;
y = newY;
return;
}
} finally {
if (StampedLock.isWriteLockStamp(stamp))
sl.unlockWrite(stamp);
}
}
// upgrade read lock to write lock
void moveIfAtOrigin2(double newX, double newY) {
long stamp = sl.readLock();
try {
while (x == 0.0 && y == 0.0) {
long ws = sl.tryConvertToWriteLock(stamp);
if (ws != 0L) {
stamp = ws;
x = newX;
y = newY;
break;
}
else {
sl.unlockRead(stamp);
stamp = sl.writeLock();
}
}
} finally {
sl.unlock(stamp);
}
}
}}
新增於1.8版本。
Java 文件 java.util.concurrent.locks.StampedLock。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| StampedLock() |
建立一個新鎖,初始狀態為解鎖狀態。 |
| StampedLock(IntPtr, JniHandleOwnership) |
初始化 JNI 物件的管理表示。 這個建構子是由執行時呼叫的。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| IsReadLocked |
如果鎖目前非獨家持有,則會回傳 |
| IsWriteLocked |
如果鎖目前是專屬持有,則可回放 |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| JniPeerMembers |
取得用於調用此 Java 節點成員的 JNI 元資料。 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| ReadLockCount |
查詢該鎖所擁有的讀取鎖數量。 |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
方法
| 名稱 | Description |
|---|---|
| AsReadLock() |
回傳此 StampedLock 的清晰 |
| AsReadWriteLock() |
回傳 |
| AsWriteLock() |
回傳此 StampedLock 的清晰 |
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| Equals(Object) |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| Equals(Object) |
表示是否有其他物體「等同」於此物。 (繼承來源 Object) |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| IsLockStamp(Int64) |
判斷印章是否代表持有鎖具。 |
| IsOptimisticReadStamp(Int64) |
判斷郵票是否代表成功的樂觀閱讀。 |
| IsReadLockStamp(Int64) |
判斷該印章是否代表非專屬持有鎖具。 |
| IsWriteLockStamp(Int64) |
判斷印章是否代表專屬持有鎖具。 |
| JavaFinalize() |
已淘汰.
當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。 (繼承來源 Object) |
| Notify() |
喚醒一個正在該物件監視器上等待的執行緒。 (繼承來源 Object) |
| NotifyAll() |
喚醒所有等待該物件監視器的執行緒。 (繼承來源 Object) |
| ReadLock() |
非獨家取得鎖,必要時封鎖直到可用。 |
| ReadLockInterruptibly() |
非獨佔取得鎖,必要時阻塞,直到可用或當前執行緒中斷。 |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
回傳物件的字串表示。 (繼承來源 Object) |
| TryConvertToOptimisticRead(Int64) |
若鎖狀態與給定印章相符,則原子層次上,若印章代表持有鎖,則釋放鎖並返回觀察印章。 |
| TryConvertToReadLock(Int64) |
若鎖定狀態與給定印記相符,則原子執行以下動作之一。 |
| TryConvertToWriteLock(Int64) |
若鎖定狀態與給定印記相符,則原子執行以下動作之一。 |
| TryOptimisticRead() |
回傳一個可以日後驗證的印章,若完全鎖定則為零。 |
| TryReadLock() |
非獨家取得鎖時,若鎖可立即取得。 |
| TryReadLock(Int64, TimeUnit) |
非獨佔性取得該鎖,前提是該鎖在指定時間內可用且目前執行緒未被中斷。 |
| TryUnlockRead() |
若讀取鎖被按住,則釋放一個按鍵,無需印記值。 |
| TryUnlockWrite() |
若寫入鎖被保留,則釋放,無需印記值。 |
| TryWriteLock() |
如果鎖能立即取得,則是專屬取得。 |
| TryWriteLock(Int64, TimeUnit) |
如果鎖定在指定時間內可用且目前執行緒未被中斷,則該鎖是獨佔的。 |
| Unlock(Int64) |
若鎖狀態與給定印章相符,則釋放鎖的相應模式。 |
| UnlockRead(Int64) |
若鎖狀態與給定印記相符,則釋放非排他鎖。 |
| UnlockWrite(Int64) |
若鎖狀態與給定印記相符,則釋放排他鎖。 |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 Object) |
| Validate(Int64) |
若該鎖自發行該印章以來並非專屬取得,則該回信為真。 |
| Wait() |
導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。 (繼承來源 Object) |
| Wait(Int64, Int32) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| Wait(Int64) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| WriteLock() |
專屬取得鎖,必要時封鎖直到有空。 |
| WriteLockInterruptibly() |
獨家取得鎖,必要時封鎖,直到可用或當前執行緒中斷為止。 |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| IJavaPeerable.Finalized() |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| IJavaPeerable.JniObjectReferenceControlBlock |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 (繼承來源 JavaObject) |
| IJavaPeerable.UnregisterFromRuntime() |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
一種基於能力的鎖,具有三種模式用於控制讀寫存取。 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |