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 使得使用监视锁进行编程变得更加容易,并且有助于避免涉及锁的许多常见编程错误,但在某些情况下,你需要以更灵活的方式处理锁。 例如,用于遍历并发访问的数据结构的一些算法需要使用 ”hand-over-hand”或 ”链锁定“:获取节点 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-final 或 try-catch 的保护,以确保在必要时释放锁。
Lock实现通过提供获取锁#tryLock()的非阻塞尝试()、获取可中断#lockInterruptibly的锁(以及尝试获取可超时#tryLock(long, TimeUnit)的锁)来提供方法和语句的synchronized附加功能。
类 Lock 还可以提供的行为和语义,与隐式监视器锁的行为和语义大相径庭,例如有保证的排序、非重新进入的使用或死锁检测。 如果实现提供此类专用语义,则实现必须记录这些语义。
请注意, Lock 实例只是普通对象,可以自己用作语句中的 synchronized 目标。 获取实例的 Lock 监视器锁与调用该实例的任何 #lock 方法没有指定关系。 建议避免混淆,除非在自己的实现中,否则绝不会以这种方式使用 Lock 实例。
除非有注释,否则 null 为任何参数传递值将导致 NullPointerException 引发。
<h2>内存同步</h2>
所有实现 em 必须/em> 强制实施内置监视器锁提供的相同内存同步语义,如引用>Java 语言规范</引用>第 17 <章中所述:<ul<>li>A 成功lock操作的内存同步效果与成功的 <em>Lock</em> 操作相同。<><Lock
<li>A 成功 unlock 操作具有与成功 <em>Unlock</em> 操作相同的内存同步效果。
</ul>
锁定和解锁操作失败,以及重新进入锁定/解锁操作不需要任何内存同步效果。
<h2>实现注意事项</h2>
锁定获取的三种形式(可中断、不可中断和计时)在性能特征、排序保证或其他实现质量方面可能有所不同。 此外,中断 <em>持续</em> 获取锁的能力在给定 Lock 类中可能不可用。 因此,实现不需要为这三种形式的锁获取定义完全相同的保证或语义,也不需要支持中断正在进行的锁获取。 需要实现才能清楚地记录每个锁定方法提供的语义和保证。 它还必须遵循此接口中定义的中断语义,前提是支持锁定获取中断:完全或仅在方法输入上中断。
由于中断通常意味着取消,并且检查中断通常是不频繁的,因此实现可以倾向于响应中断,而正常方法返回。 即使可以显示中断发生在另一个操作之后可能已解除阻止线程,也是如此。 实现应记录此行为。
在 1.5 中添加。
Java文档java.util.concurrent.locks.Lock。
本页的某些部分是根据 创建和共享的工作进行的修改,并根据 许可证中所述的条款使用。
属性
| 名称 | 说明 |
|---|---|
| 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#中断,则获取该锁。 |
| Unlock() |
释放锁。 |
| UnregisterFromRuntime() |
取消注册此实例,使运行时不会从将来 Java.Interop.JniRuntime+JniValueManager.PeekValue 的调用中返回它。 (继承自 IJavaPeerable) |
扩展方法
| 名称 | 说明 |
|---|---|
| GetJniTypeName(IJavaPeerable) |
获取实例 |
| JavaAs<TResult>(IJavaPeerable) |
尝试强制 |
| JavaCast<TResult>(IJavaObject) |
执行 Android 运行时检查的类型转换。 |
| JavaCast<TResult>(IJavaObject) |
|
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
尝试强制 |