我很困惑,为什么添加到列表不会像下面那样是线程安全的
object aLock = new object();
List<string> aList = new List<string>
lock(aLock)
aList.Add("abc");
不确定为什么你要做的就是添加一个锁。 为什么这样的场景不是线程安全的?
答案 0 :(得分:2)
示例代码没用 - 如@Jon所提到的,所有线程都会锁定在自己的对象上,这意味着它们根本不会相互阻塞。不妨完全忽略锁定声明。
首先,您需要锁定所有线程共有的对象(如列表本身)。例如:
lock (aList)
aList.Add("abc");
对于“为什么”,List的内部实现可能(确实)执行在多个线程上并行执行的安全操作。这在List class MSDN docs:
中有记录此类型的公共static(在Visual Basic中为Shared)成员是thread 安全。不保证任何实例成员都是线程安全的。
List可以同时支持多个读者,只要 集合未被修改。列举一个集合是 本质上不是一个线程安全的程序。在罕见的情况下 枚举与一个或多个写访问争用,唯一的方法 确保线程安全是在整个过程中锁定集合 列举。允许多个访问集合 阅读和写作的线程,你必须实现自己的 同步。