我对ReaderWriterLockSlim SupportsRecursion的警告感到困惑

来自MSDN


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


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

最佳答案

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

关于c# - 具有LockRecursionPolicy的ReaderWriterLockSlim.SupportsRecursion与Lock,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54583908/

10-11 07:28