假设我有一个由不同线程访问的值的List。因此,通过执行以下操作,可以使其成为线程安全的:

private static object syncObject;
syncObject = new Object();

public List<double> MyList
{
    get
    {
        lock(syncObject) { return myList;}
    }
    set
    {
        lock(syncObject) { myList = value;}
    }
}

如果在我的功能之一中,我需要访问CountList属性,则它可能不再是线程安全的。那么,我该如何编写它以便即使在访问属性时也将是线程安全的?

最佳答案

就像Willem van Rumpt所说的那样,您只是同步了对该特定属性的访问,而不是使其成为线程安全的。要不重新发明轮子,可以使用System.Collections.Concurrent(https://msdn.microsoft.com/en-us/library/dd267312(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1)中的集合

另一个更可行的选择是使用不可变列表。不幸的是,afaik .Net在这里没有提供太多服务。我知道的唯一实现是在Microsoft.FSharp.Collections中。此命名空间中的列表是一个不变的单链接列表。 (尽管我还没有在C#中使用它)。

更新:
Matías Fidemraizer所述,.net 4.5及更高版本有可用的System.Collections.Immutable nuget包,其中包含多个不可变集合的实现。谢谢!

10-07 19:30
查看更多