假设我有一个由不同线程访问的值的List
。因此,通过执行以下操作,可以使其成为线程安全的:
private static object syncObject;
syncObject = new Object();
public List<double> MyList
{
get
{
lock(syncObject) { return myList;}
}
set
{
lock(syncObject) { myList = value;}
}
}
如果在我的功能之一中,我需要访问
Count
的List
属性,则它可能不再是线程安全的。那么,我该如何编写它以便即使在访问属性时也将是线程安全的? 最佳答案
就像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包,其中包含多个不可变集合的实现。谢谢!