StampedLock 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
功能型鎖定,具有三種控制讀取/寫入存取的模式。
[Android.Runtime.Register("java/util/concurrent/locks/StampedLock", ApiSince=24, DoNotGenerateAcw=true)]
public class StampedLock : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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 的狀態是由版本和模式所組成。 鎖定擷取方法會傳回戳記,代表及控制鎖定狀態的存取;這些方法的「試用」版本可能會傳回特殊值零,以表示無法取得存取權。 鎖定釋放和轉換方法需要戳記作為自變數,如果它們不符合鎖定的狀態,則失敗。 這三種模式包括:
<ul>
<李><b>寫作。</b> 方法 #writeLock
可能會封鎖等候獨佔存取,並傳回可用於方法 #unlockWrite
釋放鎖定的戳記。 也會提供 Untimed 和 timed 版本的 tryWriteLock
。 當鎖定處於寫入模式時,可能不會取得讀取鎖定,而且所有開放式讀取驗證都會失敗。
<李><b>閱讀。</b> 方法 #readLock
可能會封鎖等候非獨佔存取,並傳回可用於方法 #unlockRead
釋放鎖定的戳記。 也會提供 Untimed 和 timed 版本的 tryReadLock
。
<李><b>開放式閱讀。</b> 方法 #tryOptimisticRead
只有在目前未在寫入模式中保留鎖定時,才會傳回非零戳記。 如果在取得指定的戳記之後尚未取得鎖定,則方法 #validate
會傳回 true,在此情況下,在呼叫 tryOptimisticRead
之後,最近寫入鎖定釋放之前的所有動作都會發生。 此模式可視為讀取鎖定的極弱版本,隨時可由寫入器中斷。 針對簡短只讀程式代碼區段使用開放式讀取模式,通常會減少爭用並改善輸送量。 然而,它的使用本質上是脆弱的。 開放式讀取區段應該只會讀取字段,並將它們保存在局部變數中,以供稍後在驗證之後使用。 在開放式讀取模式中讀取的欄位可能會非常不一致,因此只有在您已熟悉數據表示法,才能檢查一致性和/或重複叫用方法 validate()
時,才會套用使用量。 例如,在先讀取物件或數位參考,然後存取其中一個字段、元素或方法時,通常需要這類步驟。
</ul>
這個類別也支援有條件地跨三種模式提供轉換的方法。 例如,方法 #tryConvertToWriteLock
會嘗試「升級」模式,如果 (1) 已在閱讀模式中為寫入模式 (2),而且開放式讀取模式中沒有其他讀取器或 (3),則傳回有效的寫入戳記,且鎖定可用。 這些方法的形式是設計來協助減少某些在重試型設計中發生的程式代碼膨脹。
StampedLocks 的設計目的是在開發安全線程元件時做為內部公用程式。 其使用依賴其所保護之數據、物件和方法的內部屬性知識。 它們不會重新進入,因此鎖定的主體不應該呼叫其他可能嘗試重新取得鎖定的未知方法(雖然您可以將戳記傳遞給其他可以使用或轉換它的方法)。 讀取鎖定模式的使用仰賴相關的程式碼區段不受副作用影響。 未經驗證的開放式讀取區段無法呼叫無法容忍潛在不一致的方法。 戳記使用有限表示法,而且不是以密碼編譯方式保護(也就是有效的戳記可能是可以猜測的)。 戳記值可能會在連續作業一年後回收(不超過)一年。 未使用此期間或驗證的戳記可能會無法正確驗證。 StampedLocks 可串行化,但一律還原串行化為初始解除鎖定狀態,因此它們不適用於遠端鎖定。
和 一樣 java.util.concurrent.Semaphore Semaphore
,但與大多數 Lock
實作不同,StampedLocks 沒有擁有權的概念。 一個線程中取得的鎖定可以在另一個線程中釋放或轉換。
StampedLock 的排程原則不一致偏好讀取器而非寫入器,反之亦然。 所有「試用」方法都是盡最大努力,不一定符合任何排程或公平性原則。 從任何「try」方法取得或轉換鎖定的零傳回不會攜帶任何鎖定狀態的相關信息;後續的調用可能會成功。
因為它支援跨多個鎖定模式的協調使用方式,所以此類別不會直接實 Lock
作 或 ReadWriteLock
介面。 不過,在只需要一組相關聯的功能的應用程式中,可能會檢視 #asReadLock()
#asWriteLock()
#asReadWriteLock()
StampedLock 或 。
<b>記憶體同步處理。</b> 在任一<模式中成功鎖定之效果的方法具有與 em>Lock</em> 動作相同的記憶體同步處理效果,如引用>Java 語言規格</引用>的第 17 <章所述。 在寫入模式中成功解除鎖定的方法與 em Unlock</em>> 動作具有相同的記憶體同步處理效果<。 在開放式讀取使用方式中,在最近寫入模式解除鎖定動作之前的動作,只有在稍後的驗證傳回 true 時,才保證在 tryOptimisticRead 之後發生動作;否則,不保證 tryOptimisticRead 與驗證之間的讀取會取得一致的快照集。
<b>範例使用方式。</b> 下列說明類別中維護簡單二維點的一些使用慣用語。 範例程式代碼會說明一些 try/catch 慣例,即使這裡並非完全需要這些慣例,因為其主體中不會發生任何例外狀況。
{@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.util.concurrent.locks.StampedLock
Java 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
建構函式
StampedLock() |
建立新的鎖定,一開始處於解除鎖定狀態。 |
StampedLock(IntPtr, JniHandleOwnership) |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 |
屬性
Class |
傳回這個 |
Handle |
基礎Android實例的句柄。 (繼承來源 Object) |
IsReadLocked |
如果鎖定目前非獨佔保留,則傳 |
IsWriteLocked |
如果鎖定目前是獨佔保留,則傳 |
JniIdentityHashCode |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
JniPeerMembers |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 |
PeerReference |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
ReadLockCount |
查詢此鎖定保留的讀取鎖定數目。 |
ThresholdClass |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 |
ThresholdType |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 |
方法
AsReadLock() |
傳回這個 StampedLock 的一般 |
AsReadWriteLock() |
傳 |
AsWriteLock() |
傳回這個 StampedLock 的一般 |
Clone() |
建立並傳回這個 對象的複本。 (繼承來源 Object) |
Dispose() |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
Dispose(Boolean) |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
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) |
ToArray<T>() |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 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() |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
Validate(Int64) |
如果鎖定自發行指定的戳記之後尚未獨佔取得,則傳回 true。 |
Wait() |
讓目前線程等候直到喚醒為止,通常是藉由em <notified/em>或<em>interrupted</em> 來喚醒它。<> (繼承來源 Object) |
Wait(Int64, Int32) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
Wait(Int64) |
讓目前的線程等到喚醒為止,通常是因為 <em>notified</em> 或 <em>interrupted</em>,或直到經過一定數量的實時為止。 (繼承來源 Object) |
WriteLock() |
獨佔取得鎖定,必要時會封鎖,直到可用為止。 |
WriteLockInterruptibly() |
獨佔取得鎖定,必要時封鎖,直到可用或目前的線程中斷為止。 |
明確介面實作
IJavaPeerable.Disposed() |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
IJavaPeerable.DisposeUnlessReferenced() |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
IJavaPeerable.Finalized() |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
IJavaPeerable.JniManagedPeerState |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
IJavaPeerable.SetPeerReference(JniObjectReference) |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 (繼承來源 Object) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 |
GetJniTypeName(IJavaPeerable) |
功能型鎖定,具有三種控制讀取/寫入存取的模式。 |