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 的狀態是由版本和模式所組成。 鎖定擷取方法會傳回戳記,代表和控制鎖定狀態的存取;這些方法的「try」版本可能會改為傳回特殊值零,代表無法取得存取權。 鎖定釋放和轉換方法需要戳記做為引數,如果它們不符合鎖定的狀態,則會失敗。 這三個模式為:
<ul>
<li >< b > 撰寫。 </b > 方法 #writeLock
可能會封鎖等候獨佔存取,並傳回可用於 方法 #unlockWrite
釋放鎖定的戳記。 也會提供 未計時和計時版本的 tryWriteLock
。 在寫入模式中保留鎖定時,不會取得讀取鎖定,而且所有開放式讀取驗證都會失敗。
<li >< b > Reading. </b > 方法 #readLock
可能會封鎖等候非獨佔存取,並傳回可用於釋放鎖定的方法 #unlockRead
中的戳記。 也會提供 未計時和計時版本的 tryReadLock
。
<li >< 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 檔。
此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。
建構函式
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) |
讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。 (繼承來源 Object) |
Wait(Int64, Int32) |
讓目前的執行緒等到喚醒為止,通常是 < 透過 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) |
功能型鎖定,具有三種模式來控制讀取/寫入存取。 |