当我有了这个密码:
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);
}
}
}
发布于 2014-09-05 07:42:18
不是的。MSDN清楚地指出,没有一种List<T>
方法是线程安全的:
不保证任何实例成员都是线程安全的。 在一个列表上执行多个读取操作是安全的,但是如果在读取集合时修改了集合,则可能会出现问题。
构造函数本身始终是线程安全的:还不能从另一个实例调用它。
如果像在代码中一样,为List<T>
构造函数提供另一个List<T>
,这是不安全的,因为传入的List<T>
在构造函数处理时可能会发生变化(然后应用上述规则)。
发布于 2014-09-05 07:46:54
即使在lock语句中设置构造函数,列表的使用也不会是线程安全。
使用线程安全集合(如BlockingCollection )。
http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx
https://stackoverflow.com/questions/25680866
复制相似问题