带 LockRecursionPolicy.SupportsRecursion 的 ReaderWriterLockSlim 与锁
ReaderWriterLockSlim with LockRecursionPolicy.SupportsRecursion vs lock
我对 ReaderWriterLockSlim
SupportsRecursion
的警告感到困惑
来自MSDN
By default, new instances of ReaderWriterLockSlim are created with the
LockRecursionPolicy.NoRecursion flag and do not allow recursion. This
default policy is recommended for all new development, because
recursion introduces unnecessary complications and makes your code
more prone to deadlocks.
我不明白的是为什么这个警告不适用于递归的内置 lock
语句?
如 here 所述,C# 中的 lock
关键字基于 Monitor
对象,一种 独占 同步机制。 "Exclusive" 表示,当第一个线程进入临界区时,任何后续线程都将 阻塞。
另一方面,ReaderWriterLockSlim
区分了reader锁和writer锁。它们是旨在用于(并提供改进的并发性)有很多 reader 但只是偶尔写入更新的场景。 Reader/Writer 锁是 非独占的。
A lock
知道它被锁定在哪个线程上,因此如果该线程重新进入临界区,它只会增加一个计数器并继续。
A ReaderWriterLockSlim
的情况比较复杂。因为它区分了读锁和写锁,并且因为有时希望在不创建竞争条件的情况下锁定写,ReaderWriterLockSlim 提供了一个 UpgradableLock
允许您暂时增强写锁的能力而不用担心当您转换到写入模式时,由来自另一个线程的恶意写入引起的竞争条件。
如您所见,ReaderWriterLockSlim
提供了比 lock
功能更丰富但也更复杂的同步模型。声明您打算使用递归的要求是承认这种额外的复杂性。
进一步阅读
Synchronization Essentials: Locking
Advanced Threading: Reader/Writer Locks
Why Lock Recursion is Generally a Bad Idea Anyway
我对 ReaderWriterLockSlim
SupportsRecursion
来自MSDN
By default, new instances of ReaderWriterLockSlim are created with the LockRecursionPolicy.NoRecursion flag and do not allow recursion. This default policy is recommended for all new development, because recursion introduces unnecessary complications and makes your code more prone to deadlocks.
我不明白的是为什么这个警告不适用于递归的内置 lock
语句?
如 here 所述,C# 中的 lock
关键字基于 Monitor
对象,一种 独占 同步机制。 "Exclusive" 表示,当第一个线程进入临界区时,任何后续线程都将 阻塞。
ReaderWriterLockSlim
区分了reader锁和writer锁。它们是旨在用于(并提供改进的并发性)有很多 reader 但只是偶尔写入更新的场景。 Reader/Writer 锁是 非独占的。
A lock
知道它被锁定在哪个线程上,因此如果该线程重新进入临界区,它只会增加一个计数器并继续。
A ReaderWriterLockSlim
的情况比较复杂。因为它区分了读锁和写锁,并且因为有时希望在不创建竞争条件的情况下锁定写,ReaderWriterLockSlim 提供了一个 UpgradableLock
允许您暂时增强写锁的能力而不用担心当您转换到写入模式时,由来自另一个线程的恶意写入引起的竞争条件。
如您所见,ReaderWriterLockSlim
提供了比 lock
功能更丰富但也更复杂的同步模型。声明您打算使用递归的要求是承认这种额外的复杂性。
进一步阅读
Synchronization Essentials: Locking
Advanced Threading: Reader/Writer Locks
Why Lock Recursion is Generally a Bad Idea Anyway