C#面试题更新 2026-08-05

在 C# 里,通过 LockRecursionPolicy 可以怎样管控锁的重入行为?

风险判断技术原理C#

考察说明

考查对 C# 中 ReaderWriterLockSlim 的 LockRecursionPolicy 原理及用法的掌握。

回答思路

  1. 【回答框架 1】LockRecursionPolicy 是 ReaderWriterLockSlim 构造函数的参数枚举,用于决定锁是否支持递归获取。枚举值为 NoRecursion 和 SupportsRecursion,前者为默认值。
  2. 【回答框架 2】当设为 NoRecursion 时,同一线程若重复获取同一锁(包括读锁、写锁或升级锁),会抛出 LockRecursionException;设为 SupportsRecursion 时允许递归,但需注意递归模式须与锁类型匹配,例如读锁可递归获取,写锁可递归获取,但递归获取写锁时需先释放读锁等。
  3. 【回答框架 3】递归锁会降低性能,并增加死锁风险,因为嵌套获取容易造成锁顺序不一致;在设计中应尽量避免递归,若确需递归,建议将递归逻辑拆分为独立方法,或使用可重入的同步原语如 Monitor(C# 的 lock 语句本质上支持递归)。
  4. 【回答框架 4】使用时需在创建 ReaderWriterLockSlim 实例时传入枚举值,例如 new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);此后通过 EnterReadLock、EnterWriteLock 等方法控制锁的获取与释放,配合 try/finally 确保释放。
  5. 【关键点 1】LockRecursionPolicy 是 ReaderWriterLockSlim 的构造参数,默认 NoRecursion。
  6. 【关键点 2】NoRecursion 下同线程重复获取锁会抛 LockRecursionException。
  7. 【关键点 3】SupportsRecursion 允许递归,但需注意锁类型匹配与释放顺序。
  8. 【关键点 4】递归锁有性能开销和死锁风险,应尽量避免。
  9. 【易错点 1】不能把 LockRecursionPolicy 用于 Monitor 或 lock 语句,只适用于 ReaderWriterLockSlim。
  10. 【易错点 2】递归获取读写锁时若顺序不当,可能引发死锁或异常。
  11. 【易错点 3】允许递归不意味着随意嵌套,过度使用会显著降低吞吐。