C#访问List<T>.Count是否需要调用ReaderWriterLockSlim.EnterReadLock?
1. List<T>.Count 本身不具备线程安全性
List<T> 的所有公共实例成员官方都不承诺线程安全。即便Count的底层实现是直接返回内部int类型的_size字段,单次读写int在32位及以上系统中是原子操作,不会出现撕裂值,但:
- 没有同步机制的前提下,无法保证内存可见性,当前线程可能长期读到CPU缓存中的旧
Count值 - 无法避免指令重排导致的逻辑异常
2. 访问someList.Count必须加读锁,你示例中的写法是合理的
加读锁的必要性体现在两点:
ReaderWriterLockSlim的锁进出操作自带内存屏障,能保证你读到的Count是所有线程修改后的最新值,不会出现脏读- 持读锁判断
Count < 10的过程中,其他线程无法获取写锁修改集合,可以避免竞态条件:如果不加读锁,你刚读到Count=9还没拿到写锁的间隙,其他线程可能已经插入元素把Count改成10,等你拿到写锁再插入就会超出长度限制 - 读写锁的性能符合你对高性能的要求,读多写少场景下开销远低于全量互斥锁,完全满足你的需求
注意:所有对
_someList的读写操作都必须用同一个_lock实例保护,所有读操作加读锁、所有写操作加写锁,才能保证整体逻辑的线程安全。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

