Share via


ILock 介面

定義

Lock 實作提供比使用 synchronized 方法和語句取得的更廣泛的鎖定作業。

[Android.Runtime.Register("java/util/concurrent/locks/Lock", "", "Java.Util.Concurrent.Locks.ILockInvoker")]
public interface ILock : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/Lock", "", "Java.Util.Concurrent.Locks.ILockInvoker")>]
type ILock = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
衍生
屬性
實作

備註

Lock 實作提供比使用 synchronized 方法和語句取得的更廣泛的鎖定作業。 它們允許更有彈性的建構、可能有不同的屬性,而且可能支援多個相關聯的 Condition 物件。

鎖定是一種工具,可用來控制多個線程對共用資源的存取。 通常,鎖定會提供共用資源的獨佔存取權:一次只有一個線程可以取得鎖定,而且所有共用資源的存取權都需要先取得鎖定。 不過,某些鎖定可能會允許並行存取共用資源,例如的 ReadWriteLock讀取鎖定。

使用 synchronized 方法或 語句可讓您存取與每個對象相關聯的隱含監視器鎖定,但強制所有鎖定擷取和釋放以區塊結構化的方式發生:取得多個鎖定時,必須以相反的順序釋放,而且所有鎖定都必須以取得的相同語彙範圍釋放。

雖然方法和語句的範圍機制 synchronized 可讓您更輕鬆地使用監視鎖定進行程序設計,並協助避免許多涉及鎖定的常見程序設計錯誤,但在某些情況下,您需要以更有彈性的方式使用鎖定。 例如,某些用於周遊並行存取數據結構的演算法需要使用 &商數;交握&商;或 &商;鏈結鎖定&商;:您取得節點 A 的鎖定、節點 B、釋放 A 並取得 C、釋放 B 和取得 D 等等。 介面的 Lock 實作可讓鎖定在不同的範圍內取得和釋放,並允許以任何順序取得和釋放多個鎖定,藉此使用這類技術。

隨著此增加的彈性,還有額外的責任。 缺少區塊結構化鎖定會移除方法與語句所 synchronized 發生的鎖定自動釋放。 在大部分情況下,應該使用下列慣用語:

{@code
            Lock l = ...;
            l.lock();
            try {
              // access the resource protected by this lock
            } finally {
              l.unlock();
            }}

鎖定和解除鎖定發生在不同的範圍內時,請務必小心確保保留鎖定時執行的所有程式代碼都會受到 try-finally 或 try-catch 的保護,以確保在必要時釋放鎖定。

Lock實作藉由提供非封鎖嘗試取得鎖定 () #tryLock() 、嘗試取得可中斷 (#lockInterruptibly的鎖定,以及嘗試取得可能會逾時 () #tryLock(long, TimeUnit) 的鎖定,藉此提供使用方法和語句的額外功能synchronized

類別 Lock 也可以提供與隱含監視器鎖定不同的行為和語意,例如保證順序、非重新進入使用方式或死結偵測。 如果實作提供這類特製化語意,則實作必須記錄這些語意。

請注意, Lock 實例只是一般物件,而且本身可以當做 語句中的 synchronized 目標使用。 取得實例的 Lock 監視鎖定沒有指定的關聯性,無法叫用該實例的任何 #lock 方法。 建議您避免混淆,除非您在自己的實作中,否則絕不會以這種方式使用 Lock 實例。

除非已標註,否則傳遞 null 任何參數的值將會導致 NullPointerException 擲回 。

<h2>記憶體同步<處理/h2>

em 的所有實作<都必須<>強制執行與內建監視器鎖定所提供的相同記憶體同步處理語意,如引用>Java 語言規格</引文的第 17 <章所述:<ul><li>成功lock作業的記憶體同步處理效果與成功的 <em>Lock</>em> 動作相同。Lock> <li>成功 unlock 作業的記憶體同步處理效果與成功的 <em>Unlock</em> 動作相同。 </ul>

不成功的鎖定和解除鎖定作業,以及重新進入鎖定/解除鎖定作業,不需要任何記憶體同步處理效果。

<h2>實作考慮</h2>

鎖定擷取的三種形式 (可中斷、不可中斷和計時) 可能會因效能特性、排序保證或其他實作品質而有所不同。 此外,在給定Lock類別中可能無法使用中斷<em>進行<中/em>取得鎖定的能力。 因此,實作不需要為這三種形式的鎖定擷取定義完全相同的保證或語意,也不需要支持持續鎖定擷取中斷。 需要實作,才能清楚記錄每個鎖定方法所提供的語意和保證。 它也必須遵守此介面中所定義的中斷語意,以達到支持鎖定擷取中斷的程度:這完全是在方法專案上,或只有方法專案。

由於中斷通常表示取消,而且檢查中斷通常不常發生,實作可能會偏好回應中斷而非正常方法傳回。 即使它可以顯示在另一個動作之後發生的中斷可能已解除封鎖線程,也是如此。 實作應該記錄此行為。

在 1.5 中新增。

java.util.concurrent.locks.LockJava 檔。

此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據 中所述的詞彙使用。

屬性

Handle

取得基礎 Android 物件的 JNI 值。

(繼承來源 IJavaObject)
JniIdentityHashCode

傳回包裝實例的 java.lang.System.identityHashCode() 值。

(繼承來源 IJavaPeerable)
JniManagedPeerState

受控對等的狀態。

(繼承來源 IJavaPeerable)
JniPeerMembers

成員存取和調用支援。

(繼承來源 IJavaPeerable)
PeerReference

JniObjectReference 回已包裝 Java 物件實例的 。

(繼承來源 IJavaPeerable)

方法

Disposed()

在處置實例時呼叫。

(繼承來源 IJavaPeerable)
DisposeUnlessReferenced()

如果沒有這個實例的未完成參考,則呼叫 Dispose(),否則不會執行任何動作。

(繼承來源 IJavaPeerable)
Finalized()

實例完成時呼叫。

(繼承來源 IJavaPeerable)
Lock()

取得鎖定。

LockInterruptibly()

除非目前的線程中斷線程中斷,否則取得鎖定。

NewCondition()

傳回系結至這個Lock實例的新Condition實例。

SetJniIdentityHashCode(Int32)

設定所 JniIdentityHashCode傳回的值。

(繼承來源 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Lock 實作提供比使用 synchronized 方法和語句取得的更廣泛的鎖定作業。

(繼承來源 IJavaPeerable)
SetPeerReference(JniObjectReference)

設定所 PeerReference傳回的值。

(繼承來源 IJavaPeerable)
TryLock()

只有在叫用時免費時,才會取得鎖定。

TryLock(Int64, TimeUnit)

如果鎖定在指定的等候時間內是免費的,且目前線程尚未中斷 Thread#interrupt,則會取得鎖定。

Unlock()

釋放鎖定。

UnregisterFromRuntime()

取消註冊此實例,讓運行時間不會從未來的 Java.Interop.JniRuntime+JniValueManager.PeekValue 調用傳回它。

(繼承來源 IJavaPeerable)

擴充方法

JavaCast<TResult>(IJavaObject)

執行 Android 執行時間檢查的類型轉換。

JavaCast<TResult>(IJavaObject)

Lock 實作提供比使用 synchronized 方法和語句取得的更廣泛的鎖定作業。

GetJniTypeName(IJavaPeerable)

Lock 實作提供比使用 synchronized 方法和語句取得的更廣泛的鎖定作業。

適用於