c# 线程安全

wqzone 2016-02-15 11:44:35
请问如果两个或多个线程同时给一个list<object>添加值(不会remove),线程是安全吗?为何需要lock?个人感觉都是简单写,不读,为何需要lock?
...全文
258 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqzone 2016-02-17
  • 打赏
  • 举报
回复
终于明白:list.add本身就线程非安全,所以必须lock
  • 打赏
  • 举报
回复
当 List<T> 被修改时,并发进行读和写操作,就不是线程安全的,就会抛出异常。 必须 lock。
正怒月神 2016-02-16
  • 打赏
  • 举报
回复
需要 Lock
Poopaye 2016-02-16
  • 打赏
  • 举报
回复
Console.WriteLine(((ICollection)list).IsSynchronized);
list自己都说了它是非线程安全的,你有什么理由不相信呢?
qbilbo 2016-02-16
  • 打赏
  • 举报
回复
在逻辑CPU大于1的机器上,不LOCK非常容易出错。
List<object> lst = new List<object>();
Parallel.For(0, 10, (n) =>
 {
        for (int i = n * 100000; i < (n + 1) * 100000; i++)
        {
             lst.Add(new object());
         }
});
Console.WriteLine("共:{0}条记录。", lst.Count);
.net中有:ConcurrenctList吗?
Justin-Liu 2016-02-16
  • 打赏
  • 举报
回复
不lock会出错吗?
crystal_lz 2016-02-16
  • 打赏
  • 举报
回复
当然要lock msdn说 只保证所有静态函数线程安全
snowmagic 2016-02-16
  • 打赏
  • 举报
回复
你感觉的简单写背后其实会做很多工作,比如修改链表指针,表长度 list的insert不是原子操作,换句话说他有可能被其他线程打断,所以需要你在你的代码里加锁 可以换成concurrenctList,他的插入是原子的
FTD_Fred 2016-02-16
  • 打赏
  • 举报
回复
lock还是需要的,少年
欢乐的小猪 2016-02-16
  • 打赏
  • 举报
回复
1L不对。 List不是线程安全的。 .net也有并行库 System.Collections.Concurrent
wizzly 2016-02-16
  • 打赏
  • 举报
回复
你这种情况不用lock,一般lock针对竞争性资源,比如网络通讯,I/O操作,必须上一个执行结束,再进行下一个。

110,538

社区成员

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

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

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