是List <t>(List <t>)构造函数线程安全吗?</t> </t>

时间:2014-09-05 07:40:00

标签: c#

当我有这段代码时:

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);
        }
    }
}

2 个答案:

答案 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