在C#多线程编程里,当共享数据被大量线程读取、少量线程修改时,使用Monitor或lock会让所有操作串行化,读操作之间也无法并发。ReaderWriterLockSlim是System.Threading提供的轻量读写锁,支持多读单写,能明显提升此类场景的吞吐能力。

ReaderWriterLockSlim基础用法
创建实例后,读线程调用EnterReadLock与ExitReadLock,写线程调用EnterWriteLock与ExitWriteLock。务必在finally中释放锁,防止异常导致死锁。
using System;
using System.Threading;
class Cache
{
private ReaderWriterLockSlim _rw = new ReaderWriterLockSlim();
private Dictionary<string, string> _data = new Dictionary<string, string>();
public string Get(string key)
{
_rw.EnterReadLock();
try
{
// 多个读线程可同时进入
return _data.ContainsKey(key) ? _data[key] : null;
}
finally
{
_rw.ExitReadLock();
}
}
public void Set(string key, string value)
{
_rw.EnterWriteLock();
try
{
// 写线程独占访问
_data[key] = value;
}
finally
{
_rw.ExitWriteLock();
}
}
}
可升级读锁减少写冲突
若线程先读后写,直接用写锁会阻塞其他读线程。可先进入升级读锁EnterUpgradeableReadLock,确认需要修改后再升级为写锁。
public void AddIfMissing(string key, string value)
{
_rw.EnterUpgradeableReadLock();
try
{
if (!_data.ContainsKey(key))
{
_rw.EnterWriteLock();
try
{
_data[key] = value;
}
finally
{
_rw.ExitWriteLock();
}
}
}
finally
{
_rw.ExitUpgradeableReadLock();
}
}
常用属性与配置
通过构造函数可设置锁递归策略,默认不允许递归。生产环境建议保持默认,避免复杂嵌套导致难以排查的问题。
| 成员 | 说明 |
|---|---|
| EnterReadLock | 进入读锁,可多人并发 |
| EnterWriteLock | 进入写锁,独占资源 |
| EnterUpgradeableReadLock | 可升级读锁,单线程持有 |
| RecursionPolicy | 控制是否允许同一线程重复加锁 |
提升效率的注意事项
- 读锁内不要做耗时操作,否则写线程会长时间等待。
- 不要跨方法持有锁,尽量缩小锁范围。
- 使用using封装或try-finally确保释放。
- 高并发读场景可配合ImmutableArray等不可变类型进一步降低锁依赖。
读写锁适合读多写少。若写操作频繁,其开销可能高于普通Monitor,应结合压测选择方案。
小结
ReaderWriterLockSlim通过分离读写权限,让C#程序在多线程读场景下获得更高并发度。正确使用读锁、写锁与可升级读锁,并控制锁粒度,就能实现高效的读写锁控制。
C#ReaderWriterLockSlim读写锁多线程锁性能修改时间:2026-07-25 09:18:25