我对ReaderWriterLockSlim
SupportsRecursion
的警告感到困惑
来自MSDN
默认情况下,ReaderWriterLockSlim的新实例是使用 LockRecursionPolicy.NoRecursion标志,并且不允许递归。这个 建议对所有新开发使用默认策略,因为 递归会带来不必要的复杂性并使您的代码 更容易陷入僵局。
我不明白的是,为什么此警告不适用于递归的内置lock
语句?
答案 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