如何在线程之间共享ReaderWriterLock?它是单身实现的吗?

问题描述

| 当您想使用“ 0”时,您可以这样声明:
ReaderWriterLock rwLock = new ReaderWriterLock;
好吧,如果您要对要访问要保护的某些资源的所有不同线程执行此操作,则它们(大概)都使用不同的ReaderWriterLock实例。 ReaderWriterLock实例如何在线程之间共享? 另外,作为奖励,有人可以为我确认您真正的“锁定”是ReaderWriterLock状态,而不是任何资源。与
lock(someResourcetoLock)
不同,除了ReaderWriterLock实例的状态(是否处于读取或写入模式,以及是否允许读取和写入)外,您什么都没有锁定。

解决方法

如果您在每个线程或每个方法中使用
ReaderWriterLock rwLock = new ReaderWriterLock
(即作为方法变量),则您的代码很可能被破坏。这不是一个单例。它依赖于使用同一锁访问受保护数据的所有线程。这通常是通过将锁放在字段中来实现的,即
class Foo {
    ReaderWriterLock rwLock = new ReaderWriterLock();
    // lots of code accessing the rwLock field for this instance
}
另外-在许多情况下,可能会考虑ѭ5。更少的开销。重新跟进;当获取锁时,您正在更改内部状态(以线程安全的方式),以保留“许多阅读器
nand
单写器”的期望(可能直到发生这种情况时才阻塞,即,已撤消有冲突的锁)。,ReaderWriterLock实例如何在线程之间共享? 创建单个“ 0”实例,并在访问您要保护的共享资源的所有线程中使用它。 另外,作为奖励,有人可以为我确认您真正的“锁定”是ReaderWriterLock状态,而不是任何资源。与锁(someResourceToLock)不同,除了ReaderWriterLock实例的状态外,您不会锁定其他任何东西 你真的在锁。
lock(obj) { ... }
只是其中的捷径(此处简化了,实际的实现还有一些其他的细微之处可以处理极端情况):
Monitor.Enter(obj)
  ...
try {
} finally {
  Monitor.Exit(obj);
}
使用每个引用类型中的字段来保存ѭ10所使用的状态。 正如Marc所言,除非您需要
ReaderWriterLock
给出的公平性(保证线程以它们开始等待的顺序进入),否则请考虑
ReaderWriterLockSlim

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...