You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:18:02