当我有这段代码时:
public static List<Module> ExtensionList
{
get
{
return new List<Module>(Extensions);
}
}
它是线程安全的吗?例如。它复制列表时会在Extensions
上发出锁吗?或者我应该明确这样做:
public static List<Module> ExtensionList
{
get
{
lock (Extensions)
{
return new List<Module>(Extensions);
}
}
}
答案 0 :(得分:4)
没有。 MSDN明确指出List<T>
的任何方法都不是线程安全的:
不保证所有实例成员都是线程安全的。
在List上执行多个读取操作是安全的,但如果在读取集合时修改了集合,则会出现问题。
构造函数本身始终是线程安全的:您无法从另一个实例调用它。
如果您为List<T>
构造函数提供了另一个List<T>
,就像在代码中一样,那么它不安全,因为传入的List<T>
可能会在构造函数处理时发生变化(那么上述规则适用)。
答案 1 :(得分:1)
即使你在lock语句中设置构造函数,列表的使用也不是线程安全的。
使用类似BlockingCollection的线程安全集合
http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx