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 使得使用监视锁进行编程变得更加容易,并且有助于避免涉及锁的许多常见编程错误,但在某些情况下,你需要以更灵活的方式处理锁。 例如,用于遍历并发访问的数据结构的一些算法需要使用 ”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

返回包装实例的值 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#中断,则获取该锁。

Unlock()

释放锁。

UnregisterFromRuntime()

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

(继承自 IJavaPeerable)

扩展方法

名称 说明
GetJniTypeName(IJavaPeerable)

获取实例 self类型的 JNI 名称。

JavaAs<TResult>(IJavaPeerable)

尝试强制self键入TResult,检查强制是否在Java端有效。

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

Lock 实现提供的锁定操作比使用 synchronized 方法和语句获得的锁定操作要广泛得多。

TryJavaCast<TResult>(IJavaPeerable, TResult)

尝试强制self键入TResult,检查强制是否在Java端有效。

适用于