具有LockRecursionPolicy的ReaderWriterLockSlim.SupportsRecursion与Lock

时间:2019-02-07 23:29:15

标签: c# .net concurrency locking readerwriterlockslim

我对ReaderWriterLockSlim SupportsRecursion的警告感到困惑

来自MSDN

  

默认情况下,ReaderWriterLockSlim的新实例是使用   LockRecursionPolicy.NoRecursion标志,并且不允许递归。这个   建议对所有新开发使用默认策略,因为   递归会带来不必要的复杂性并使您的代码   更容易陷入僵局。

我不明白的是,为什么此警告不适用于递归的内置lock语句?

1 个答案:

答案 0 :(得分:2)

正如here所述,C#中的lock关键字基于Monitor对象(一种排他性的同步机制)。 “排他”是指,当第一个线程进入关键部分时,所有后续线程都会被阻止。

另一方面,

ReaderWriterLockSlim区分读取器锁写入器锁。它们旨在用于(并提供改进的并发性)读者很多但偶尔写更新的情况。读取器/写入器锁是非排他性的。

lock知道它被锁定在哪个线程上,因此,如果该线程重新进入关键部分,它只会增加一个计数器并继续。

ReaderWriterLockSlim的位置更为复杂。因为它区分读锁定和写锁定,并且有时希望在不创建竞争条件的情况下锁定写操作,所以ReaderWriterLockSlim提供了UpgradableLock,可让您临时增强写功能的锁定而不必担心转换为写入模式时,来自另一个线程的恶意写入导致的竞争状况。

如您所见,ReaderWriterLockSlim提供了比lock更丰富的功能,但也更复杂的同步模型。声明您打算使用递归的要求是承认这种额外的复杂性。

进一步阅读
Synchronization Essentials: Locking
Advanced Threading: Reader/Writer Locks
Why Lock Recursion is Generally a Bad Idea Anyway