锁定iList .net线程安全

时间:2012-01-16 01:59:36

标签: .net multithreading thread-safety locking

我很困惑,为什么添加到列表不会像下面那样是线程安全的

object aLock = new object();
List<string> aList = new List<string>

lock(aLock)
   aList.Add("abc");

不确定为什么你要做的就是添加一个锁。 为什么这样的场景不是线程安全的?

1 个答案:

答案 0 :(得分:2)

示例代码没用 - 如@Jon所提到的,所有线程都会锁定在自己的对象上,这意味着它们根本不会相互阻塞。不妨完全忽略锁定声明。

首先,您需要锁定所有线程共有的对象(如列表本身)。例如:

lock (aList)
    aList.Add("abc");

对于“为什么”,List的内部实现可能(确实)执行在多个线程上并行执行的安全操作。这在List class MSDN docs

中有记录
  

此类型的公共static(在Visual Basic中为Shared)成员是thread   安全。不保证任何实例成员都是线程安全的。

     

List可以同时支持多个读者,只要   集合未被修改。列举一个集合是   本质上不是一个线程安全的程序。在罕见的情况下   枚举与一个或多个写访问争用,唯一的方法   确保线程安全是在整个过程中锁定集合   列举。允许多个访问集合   阅读和写作的线程,你必须实现自己的   同步。