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 实现通过使用方法和语句提供了附加功能 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.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()

获取锁,除非当前线程已中断 Thread#中断。

NewCondition()

返回绑定到此Lock实例的新Condition实例。

SetJniIdentityHashCode(Int32)

设置 返回 JniIdentityHashCode的值。

(继承自 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

Lock 与使用 synchronized 方法和语句获取的锁定操作相比,实现提供了更广泛的锁定操作。

(继承自 IJavaPeerable)
SetPeerReference(JniObjectReference)

设置 返回 PeerReference的值。

(继承自 IJavaPeerable)
TryLock()

仅当锁在调用时可用时才获取锁。

TryLock(Int64, TimeUnit)

如果锁在给定的等待时间内可用,并且当前线程尚未中断 Thread#中断,则获取该锁。

Unlock()

释放锁。

UnregisterFromRuntime()

取消注册此实例,以便运行时不会从将来 Java.Interop.JniRuntime+JniValueManager.PeekValue 的调用中返回它。

(继承自 IJavaPeerable)

扩展方法

JavaCast<TResult>(IJavaObject)

执行 Android 运行时检查的类型转换。

JavaCast<TResult>(IJavaObject)

Lock 与使用 synchronized 方法和语句获取的锁定操作相比,实现提供了更广泛的锁定操作。

GetJniTypeName(IJavaPeerable)

Lock 与使用 synchronized 方法和语句获取的锁定操作相比,实现提供了更广泛的锁定操作。

适用于