ILock 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
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.Lock
Java 檔。
此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據 中所述的詞彙使用。
屬性
Handle |
取得基礎 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
JniIdentityHashCode |
傳回包裝實例的 |
JniManagedPeerState |
受控對等的狀態。 (繼承來源 IJavaPeerable) |
JniPeerMembers |
成員存取和調用支援。 (繼承來源 IJavaPeerable) |
PeerReference |
傳 JniObjectReference 回已包裝 Java 物件實例的 。 (繼承來源 IJavaPeerable) |
方法
Disposed() |
在處置實例時呼叫。 (繼承來源 IJavaPeerable) |
DisposeUnlessReferenced() |
如果沒有這個實例的未完成參考,則呼叫 |
Finalized() |
實例完成時呼叫。 (繼承來源 IJavaPeerable) |
Lock() |
取得鎖定。 |
LockInterruptibly() |
除非目前的線程中斷線程中斷,否則取得鎖定。 |
NewCondition() |
傳回系結至這個 |
SetJniIdentityHashCode(Int32) |
設定所 |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
設定所 |
TryLock() |
只有在叫用時免費時,才會取得鎖定。 |
TryLock(Int64, TimeUnit) |
如果鎖定在指定的等候時間內是免費的,且目前線程尚未中斷 Thread#interrupt,則會取得鎖定。 |
Unlock() |
釋放鎖定。 |
UnregisterFromRuntime() |
取消註冊此實例,讓運行時間不會從未來的 Java.Interop.JniRuntime+JniValueManager.PeekValue 調用傳回它。 (繼承來源 IJavaPeerable) |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|