带 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