如果您想使用ReaderWriterLock
,请将其声明为:
ReaderWriterLock rwLock = new ReaderWriterLock;
如果您正在为要访问某些要保护的资源的不同线程执行此操作,那么(可能)它们都使用不同的ReaderWriterLock实例。
如何在线程之间共享ReaderWriterLock实例?
另外,作为奖励,有人可以向我确认您真正“锁定”的内容是ReaderWriterLock状态,而不是任何资源。与lock(someResourceToLock)
不同,除了ReaderWriterLock实例的状态(无论是处于读取还是写入模式,以及是否允许您进行读写),您都不会锁定任何内容。
答案 0 :(得分:2)
如果您使用ReaderWriterLock rwLock = new ReaderWriterLock
每个帖子或每个方法(即作为方法变量),那么您的代码最有可能被破坏。它不是单身人士;它依赖于使用相同锁访问受保护数据的所有线程。这通常是通过将锁放在一个字段中来实现的,即
class Foo {
ReaderWriterLock rwLock = new ReaderWriterLock();
// lots of code accessing the rwLock field for this instance
}
另外 - 在许多场景中可能会考虑ReaderWriterLockSlim
;减少开销。你的后续行动;获取锁时,您正在更改内部状态(以线程安全的方式)以保留“多读者nand
单一作者”期望(可能阻塞,直到可能,即冲突的锁已被撤销)
答案 1 :(得分:2)
如何在线程之间共享ReaderWriterLock实例?
创建ReaderWriterLock
的单实例,并在访问您要保护的共享资源的所有线程中使用它。
另外,作为奖励,有人可以向我确认你真正“锁定”的是ReaderWriterLock状态,而不是任何资源。与lock(someResourceToLock)不同,除了ReaderWriterLock实例的状态之外你没有锁定任何东西
你真的在锁定。
lock(obj) { ... }
只是一个捷径(在这里简化,真正的实现有一些额外的微妙处理边缘情况):
Monitor.Enter(obj)
...
try {
} finally {
Monitor.Exit(obj);
}
使用每种引用类型中的字段来保存Monitor
使用的状态。
正如Marc所说,考虑ReaderWriterLockSlim
,除非你需要ReaderWriterLock
给出的公平性(线程保证以他们开始等待的顺序进入)。