IReadWriteLock 接口

定义

ReadWriteLock 个维护一对关联的 Lock locks操作,一个用于只读操作,另一个用于写入。

[Android.Runtime.Register("java/util/concurrent/locks/ReadWriteLock", "", "Java.Util.Concurrent.Locks.IReadWriteLockInvoker")]
public interface IReadWriteLock : Android.Runtime.IJavaObject, IDisposable, Java.Interop.IJavaPeerable
[<Android.Runtime.Register("java/util/concurrent/locks/ReadWriteLock", "", "Java.Util.Concurrent.Locks.IReadWriteLockInvoker")>]
type IReadWriteLock = interface
    interface IJavaObject
    interface IDisposable
    interface IJavaPeerable
派生
属性
实现

注解

ReadWriteLock 个维护一对关联的 Lock locks操作,一个用于只读操作,另一个用于写入。 只要没有编写器,#readLock 读取锁就可以由多个读取器线程同时持有。 #writeLock 写入锁是独占的。

所有ReadWriteLock实现都必须保证操作(在接口中指定的Lock)的writeLock内存同步效果也与关联的操作保持一致readLock。 也就是说,成功获取读取锁的线程将看到以前版本的写入锁所做的所有更新。

读写锁允许访问共享数据时,并发级别高于相互排除锁允许的并发级别。 它利用了这样一个事实:虽然一次只有一个线程( <em>编写器</em> 线程)可以修改共享数据,但在许多情况下,任意数量的线程都可以同时读取数据(因此 <em>读取器</em> 线程)。 从理论上讲,使用读写锁所允许的并发性增加将导致使用互斥锁的性能改进。 实际上,这种并发的增加只会在多处理器上完全实现,并且仅当共享数据的访问模式适合时。

读/写锁是否会提高互斥锁的性能取决于数据与修改相比读取的频率、读取和写入操作的持续时间以及数据争用(即尝试同时读取或写入数据的线程数)。 例如,最初使用数据填充的集合,之后很少修改,而经常搜索(如某种目录)是使用读/写锁的理想候选项。 但是,如果更新变得频繁,则数据大部分时间都处于独占锁定状态,并且并发性增加很少。 此外,如果读取操作太短,读写锁实现的开销(这本质上比相互排除锁复杂)可以主导执行成本,特别是因为许多读写锁实现仍然通过少量代码序列化所有线程。 最终,只有分析和度量才能确定使用读写锁是否适合应用程序。

尽管读写锁的基本操作是直截了当的,但实施必须做出许多策略决策,这可能会影响给定应用程序中读写锁的有效性。 这些策略的示例包括: <ul><li>确定在编写器释放写入锁时是否授予读取锁或写入锁(当读取器和编写器都在等待时)。 编写器首选项很常见,因为写入预期较短且不常见。 读取器首选项不太常见,因为如果读取器频繁且生存期如预期,则会导致写入延迟较长。 公平或 ”in-order”还可以实现。

<li>确定读取器处于活动状态且编写器正在等待时请求读取锁的读取器是否被授予读取锁。 对读取器的首选项可以无限期地延迟编写器,而对编写器的首选项可以减少并发的可能性。

<li>确定锁是否重新进入:具有写入锁的线程是否可以重新获取它? 是否可以在持有写入锁时获取读取锁? 读取锁本身是否重新进入?

<li>是否可以将写入锁降级到读取锁,而不允许干预编写器? 读取锁是否可以升级到写入锁,而不是其他等待的读取器或编写器?

</ul> 评估应用程序给定实现的适用性时,应考虑所有这些事项。

在 1.5 中添加。

适用于 . 的 java.util.concurrent.locks.ReadWriteLockJava 文档

本页的某些部分是根据 Android 开放源代码项目创建和共享的工作进行的修改,并根据 Creative Commons 2.5 属性许可证中所述的术语使用。

属性

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)
ReadLock()

返回用于读取的锁。

SetJniIdentityHashCode(Int32)

设置由 JniIdentityHashCode. 返回的值。

(继承自 IJavaPeerable)
SetJniManagedPeerState(JniManagedPeerStates)

ReadWriteLock 个维护一对关联的 Lock locks操作,一个用于只读操作,另一个用于写入。

(继承自 IJavaPeerable)
SetPeerReference(JniObjectReference)

设置由 PeerReference. 返回的值。

(继承自 IJavaPeerable)
UnregisterFromRuntime()

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

(继承自 IJavaPeerable)
WriteLock()

返回用于写入的锁。

扩展方法

JavaCast<TResult>(IJavaObject)

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

JavaCast<TResult>(IJavaObject)

ReadWriteLock 个维护一对关联的 Lock locks操作,一个用于只读操作,另一个用于写入。

GetJniTypeName(IJavaPeerable)

ReadWriteLock 个维护一对关联的 Lock locks操作,一个用于只读操作,另一个用于写入。

适用于