1

我已经有一个初始化和填充的 Dictionary 类,我读取的值如下。

public class MyClass
{
    public static Dictionary<string,object> Dictionary { get; set; }

    public object Get(string key) 
    {
        return Dictionary[key];
    }

    public List<object> Get(object type) 
    {
        return Dictionary.Where(d=>d.Value == type);
    }
}

如您所见,我只有 2 个案例,我只是读取值。如果线程应用程序中没有关于上述代码的任何不良副作用,那么我会更喜欢使用 Dictionary 而不是使用 ConcurrentDictionary 因为更好的性能。

4

3 回答 3

1

理论上这很好,但是这不是线程安全的,因为您通过属性保留了对 Dictionary 的公共引用。这仅取决于您在保护自己免受潜在副作用方面的偏执程度。即使您将 Dictionary 的引用传递给我的对象的构造函数并且引用在包装类中是私有的,您仍然需要深复制此参数,以便如果调用者稍后修改 Dictionary 它的键/值不会发生变化在你的包装类里面。

因此,只要您小心,您的解决方案就会奏效。但是,您会让自己面临潜在的线程安全问题。

于 2013-10-07T07:43:27.597 回答
1

当线程修改字典时会出现问题。

例如,在thread a读取字典的同时,thread b正在更改某些值。Thread a在他的阅读中会得到一些改变的值。

在你的情况下,你总是从字典中阅读,所以你不会有任何问题。

于 2013-10-07T07:39:35.053 回答
0

多线程管理用于解决数据更改(更新和写入)期间的竞争条件和冲突,但对于简单的阅读,如果在您跳入已经使用字典构造完成的多线程之前,您可以避免管理多线程线程访问。

于 2013-10-07T07:47:37.543 回答