如果始终不用foreach,add、remove等是不是就没有必要加锁了?对集合操作时

oldhunter 2016-01-20 11:39:25
对集合操作时,如果始终不用foreach,add、remove等是不是就没有必要加锁了?

会不会有异步风险?
...全文
187 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你还不如说如果只读操作的话,那没线程安全风险
Poopaye 2016-01-20
  • 打赏
  • 举报
回复
引用 2 楼 oldhunter 的回复:
[quote=引用 1 楼 starfd 的回复:] 你还不如说如果只读操作的话,那没线程安全风险
对集合操作时,如果其它地方不用foreach,对 add、remove 不加锁可以吗?[/quote] 常规的集合不行,哪怕是获取Count也应该加锁 使用Synchronized返回的不用加锁
crystal_lz 2016-01-20
  • 打赏
  • 举报
回复
这得看你的情况了 有读有写 必然会有问题 得看你想要的是什么 比如

//=======场景1======
//线程1
lst_counter[0]++;
//线程2
lst_counter[0]--;
/*上面代码必然出问题 上面无论是 ++ 还是 -- 都需要依赖 lst_counter[0] 本身的值
 假设lst_counter[0] 现在是一个变量a
a++; -> a +=1 -> a = a + 1;需要取出本身的值来加1 -- 同理
假设现在a=0 按理来说 两个线程一执行 一个++ 一个-- a的值又变成了 0
可情况不一定 假设两个线程 同时执行到了++ 和 --
++                     --   (两个线程一起执行++和--的情况)
取出a的值 0             取出a的值 0 (由于没有做锁 所以他们可以一起执行)
0 + 1 = 1              0 - 1 = -1      
把1复制给a              把-1赋值给a*/
所以你认为现在 a 的值到底应该是多少?不是1就是 -1 反正不是 0
//======场景2======
//线程1
lst_timeout[0] = 5000
//线程2
//假设这里是一个访问网页的类.GetHtml("http://www.baidu.com",lst_timeout[0])
/*这种情况你锁不锁都无所谓了 因为和上面的不一样 上面的是需要依赖自身的值做操作 
而这个不一样 而这里是一个写入一个读取 */
所以说 得看你具体情况
  • 打赏
  • 举报
回复
如果你对集合内部的对象进行修改的话,也是有风险的,所以如果你无法判断你的操作是否是只读的话,那你最好认为是不安全的
oldhunter 2016-01-20
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
你还不如说如果只读操作的话,那没线程安全风险
对集合操作时,如果其它地方不用foreach,对 add、remove 不加锁可以吗?

111,128

社区成员

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

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

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