

新闻资讯
技术学院ReaderWriterLockSlim 是 C# 中适用于“多读少写”场景的高效读写锁,支持超时、取消和递归控制;需成对调用 Enter/ExitReadLock 或 Enter/ExitWriteLock,推荐 try/finally 保障释放,禁用递归与合理超时可提升安全性与性能。
ReaderWriterLockSlim 是 C# 中高效、轻量的读写锁实现,适合“多读少写”场景,能显著提升并发性能。它比传统的 lock 或 Monitor 更灵活,允许多个线程同时读,但写操作独占,且支持超时、取消和递归控制(可禁用)。
必须成对调用 EnterReadLock/ExitReadLock 或 EnterWriteLock/ExitWriteLock,推荐用 try/finally 保证释放,避免死锁。
EnterReadLock() → 访问共享资源 → 必须 ExitReadLock()
EnterWriteLock() → 修改共享资源 → 必须 ExitWriteLock()
实际项目中建议启用超时机制,防止无限等待;并始终在 finally 块中释放锁:
private readonly ReaderWriterLockSlim _rwLock = new ReaderWriterLockSlim();public string GetData() { _rwLock.EnterReadLock(); try { return _sharedData; } finally { _rwLock.ExitReadLock(); } }
public void UpdateData(string value) { if (_rwLock.TryEnterWriteLock(1000)) // 等待1秒,超时返回false { try { _sharedData = value; } finally { _rwLock.ExitWriteLock(); } } else { throw new TimeoutException("获取写锁超时"); } }
ReaderWriterLockSlim 构造时可传入参数调整行为:
new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion),避免同一线程重复加锁导致逻辑混乱new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion, LockRecursionPolicy.NoRecursion)(注意:.NET 6+ 支持 new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion) { UseSpinWait = false } 配合公平队列,但真正公平需手动管理)——更准确地说,它本身不提供严格公平,但可通过 TryEnter* + 重试 + 取消令牌模拟CancellationToken:使用 TryEnterReadLock(Int32, CancellationToken) 等重载,实现可取消的等待几个容易忽略却关键的细节:
Dispose() 释放底层内核资源(尤其长期存活对象),建议封装为 IDisposable 类型或在 using 中创建(但注意:它不是设计为短生命周期对象,通常作为字段长期持有)
被保护的数据,否则破坏线程安全;写锁是唯一允许修改的时机基本上就这些。用好 ReaderWriterLockSlim 的关键是理解“读共享、写独占”的模型,配合适当的超时和异常防护,就能在高并发读场景下兼顾安全与性能。