1

我对警告感到困惑ReaderWriterLockSlim SupportsRecursion

来自MSDN

默认情况下,ReaderWriterLockSlim 的新实例是使用 LockRecursionPolicy.NoRecursion 标志创建的,并且不允许递归。建议所有新开发使用此默认策略,因为递归会引入不必要的复杂性并使您的代码更容易出现死锁。

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

4

1 回答 1

3

正如这里所解释的,C# 中的lock关键字是基于Monitor对象的,一种独占同步机制。“独占”意味着,当第一个线程进入临界区时,任何后续线程都被阻塞。

ReaderWriterLockSlim,另一方面,区分读取器锁写入器锁。 它们旨在用于(并提供改进的并发性)有许多读取器但只是偶尔写入更新的场景。Reader/Writer 锁是非排他的。

Alock知道它被锁定在哪个线程上,因此如果该线程重新进入临界区,它只会增加一个计数器并继续。

AReaderWriterLockSlim处于更复杂的位置。因为它区分了读锁和写锁,并且因为有时需要在不创建竞争条件的情况下锁定写入,所以 ReaderWriterLockSlim 提供了一个UpgradableLock允许您临时增强写入功能的锁,而不必担心由以下原因引起的竞争条件当您转换到写入模式时,来自另一个线程的恶意写入。

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

进一步阅读
同步要点:锁定
高级线程:读写器锁定
为什么锁定递归通常是一个坏主意

于 2019-02-08T00:01:46.493 回答