ConcurrentDictionary并发场景下整数递增操作的安全性疑问
ConcurrentDictionary并发递增操作的安全性分析
直接使用 _tracker[id]++ 在并发访问场景下不安全,原因在于这个操作并非原子性的,它实际拆分为三个独立步骤:
- 从
ConcurrentDictionary中读取id对应的当前值 - 将读取到的值执行加1操作
- 把递增后的新值写回字典
在多线程并发执行时,可能出现多个线程同时读取到同一个旧值,各自完成递增后再写回,最终导致计数丢失更新的问题——比如两个线程同时读取到值为2,各自递增到3后写回,最终字典里的值是3,但实际应该是4。
而使用 _tracker.AddOrUpdate(id, 1, (id, count) => count + 1) 是安全的,因为AddOrUpdate方法是ConcurrentDictionary提供的原子操作,它会在内部通过同步机制保证“检查键是否存在→不存在则添加初始值1/存在则执行递增委托更新值”的整个流程是原子性的,不会被其他线程打断,能确保并发场景下计数的正确性。
内容的提问来源于stack exchange,提问作者Riyafa Abdul Hameed
相关产品推荐
相关产品推荐

