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
实现通过使用方法和语句提供了附加功能 synchronized
,方法是提供获取锁 () #tryLock()
(非阻塞尝试、尝试获取可在 (中断的 #lockInterruptibly
锁,以及尝试获取可能超时 (#tryLock(long, TimeUnit)
) 的锁。
类 Lock
还可以提供与隐式监视器锁完全不同的行为和语义,例如有保证的排序、不可重入的使用或死锁检测。 如果实现提供此类专用语义,则该实现必须记录这些语义。
请注意, Lock
实例只是普通对象,本身可以用作语句中 synchronized
的目标。 获取实例的 Lock
监视器锁与调用该实例的任何 #lock
方法没有指定关系。 建议避免混淆,切勿以这种方式使用 Lock
实例,除非在它们自己的实现中。
除非另有注释,否则为任何参数传递 null
值都将导致 NullPointerException
引发 。
<h2>内存同步</h2>
所有实现 em must/em> 强制实施内置监视器锁提供的相同内存同步语义,如<引用>Java 语言规范</引用>:<ul<>li>一个成功的lock
操作具有与成功的 <em>Lock</em> 操作相同的内存同步效果。<><Lock
<li>成功的unlock
操作具有与成功<解锁>/em<> 操作相同的内存同步效果。 </ul>
失败的锁定和解锁操作以及可重入锁定/解锁操作不需要任何内存同步效果。
<h2>实现注意事项</h2>
三种形式的锁获取 (可中断、不可中断和定时) 在性能特征、排序保证或其他实现质量上可能会有所不同。 此外,在给定Lock
的类中可能无法中断><<锁定的持续/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() |
获取锁,除非当前线程已中断 Thread#中断。 |
NewCondition() |
返回绑定到此 |
SetJniIdentityHashCode(Int32) |
设置 返回 |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
设置 返回 |
TryLock() |
仅当锁在调用时可用时才获取锁。 |
TryLock(Int64, TimeUnit) |
如果锁在给定的等待时间内可用,并且当前线程尚未中断 Thread#中断,则获取该锁。 |
Unlock() |
释放锁。 |
UnregisterFromRuntime() |
取消注册此实例,以便运行时不会从将来 Java.Interop.JniRuntime+JniValueManager.PeekValue 的调用中返回它。 (继承自 IJavaPeerable) |
扩展方法
JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|