我对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/