线程安全集合BUG?

SoulRed 2016-05-16 04:35:08
我用普通的
Dictionary<string, int>
3个线程把int 加到10000
100次结果有接近一半是10001

线程安全集合
ConcurrentDictionary<string, int>
3个线程把int 加到10000
100次结果有1次是10001

仅仅有这么一次才令我恐慌,
System.Collections.Concurrent;
ConcurrentDictionary
不是线程安全的么
为什么用3个Task开启3个线程后,还是有百分之一的概率不准确?
...全文
134 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不管有5000次还是5次结果为 10001,这跟“线程安全”概念都没有关系。你把结果是不是 10000跟“线程安全”这个词儿联系起来,这本身就是无厘头的。 要想保证结果是 10000,跟什么“线程安全”没有关系。需要同步。同步本身确实可以达到“线程安全”的目的,但是反之却不能胡乱理解。“线程安全的”对象的操作也需要学会线程同步。
SoulRed 2016-05-16
  • 打赏
  • 举报
回复
引用 1 楼 feiyun_Web 的回复:
一个lock解决你所有的烦恼。
引用 3 楼 shingoscar 的回复:
100%是你用法错误
引用 4 楼 sgyiliya 的回复:
代码贴出来吧。
引用 6 楼 lkr2380869 的回复:
不管你用Dictionary<string, int>还是 ConcurrentDictionary<string, int>,访问时需要加lock
6楼你的说法是错误的。concurrent类的所有操作都是不需要显式手动加锁的,他在内部已经实现了spinlock之类的锁,只需要调用正确的方法即可保证线程安全
lkr2380869 2016-05-16
  • 打赏
  • 举报
回复
不管你用Dictionary<string, int>还是 ConcurrentDictionary<string, int>,访问时需要加lock
SoulRed 2016-05-16
  • 打赏
  • 举报
回复
问题自己解决了。 在Task内部我对ConcurrentDict用了下标访问: [] 其实应该用函数:TryGetValue 和TryUpdate 对线程安全的集合进行操作。 现在没啥问题了。线程可算是安全了。。。
sgyiliya 2016-05-16
  • 打赏
  • 举报
回复
代码贴出来吧。
Poopaye 2016-05-16
  • 打赏
  • 举报
回复
100%是你用法错误
我是飞云 2016-05-16
  • 打赏
  • 举报
回复
一个lock解决你所有的烦恼。
Poopaye 2016-05-16
  • 打赏
  • 举报
回复
完全听不懂你说的1000010001是啥意思

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧