語言

StampedLock 類別

定義

一種基於能力的鎖,具有三種模式用於控制讀寫存取。

[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
屬性
實作

備註

一種基於能力的鎖,具有三種模式用於控制讀寫存取。 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

回傳此 Object的執行時類別。

(繼承來源 Object)
Handle

底層 Android 實例的帳號。

(繼承來源 Object)
IsReadLocked

如果鎖目前非獨家持有,則會回傳 true

IsWriteLocked

如果鎖目前是專屬持有,則可回放 true

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 的清晰 Lock 視圖,其中 Lock#lock 方法映射至 #readLock,其他方法亦然。

AsReadWriteLock()

回傳 ReadWriteLock 此 StampedLock 的視圖,其中 ReadWriteLock#readLock() 方法映射至 #asReadLock()ReadWriteLock#writeLock()#asWriteLock()及 。

AsWriteLock()

回傳此 StampedLock 的清晰 Lock 視圖,其中 Lock#lock 方法映射至 #writeLock,其他方法亦然。

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)

取得實例 self類型的 JNI 名稱。

JavaAs<TResult>(IJavaPeerable)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

JavaCast<TResult>(IJavaObject)

執行 Android 執行時檢查型別轉換。

JavaCast<TResult>(IJavaObject)

一種基於能力的鎖,具有三種模式用於控制讀寫存取。

TryJavaCast<TResult>(IJavaPeerable, TResult)

試著強制self輸入 TResult,檢查 強制在 Java 端是否有效。

適用於