我已经宣布了一个词典的词典:
Dictionary<String, Dictionary<String, String>> values;
我有一个getter来获取特定索引的字典:
public Dictionary<String,String> get(String idx)
{
lock (_lock)
{
return values[moduleName];
}
}
正如您所看到的,我正在多线程环境中工作。 我的问题是我需要返回我的字典的副本,以便像这样线程安全:
public Dictionary<String,String> get(String idx)
{
lock (_lock)
{
return new Dictionary<string, string>(values[moduleName]);
}
}
如果我不这样做,那么调用getter的类会收到一个副本(所以如果我从我的Dictionary<String, Dictionary<String, String>>
中删除这个字典,它仍会有用吗?
干杯,
亨利。
答案 0 :(得分:6)
Dictionary<>
不是线程安全的,但ConncurrentDictionary<>
是。
调用getter的类接收一个引用,这意味着如果你将它从values
- Dictionary中删除它仍会存在,因为只要你在某个地方有一个引用,GC就不会清除它,你只是不能再用吸气剂了。
Basicaly表示使用Dictionary<>
时有两种可能性:
ConcurrentDictionary<>
,因为它会完全适合您答案 1 :(得分:4)
如果你真的需要返回字典本身,那么你将需要有关于线程如何锁定它的规则(脆弱,如果有一个案例没有?),在一个案例中使用它只读方式(字典对于只读是线程安全的,但请注意,这假定该类的私有代码不再写入它),使用线程安全字典(ConcurrentDictionary
使用条带锁定,我的ThreadSafeDictionary
使用无锁方法,并且有不同的场景,其中一个击败另一个),或者按照你的建议制作副本。
或者,如果您公开一个方法来检索或设置两个键找到的最终字符串,枚举一个键找到的二级键,依此类推,那么您不仅可以控制锁定在一个地方完成,但它在界面的清洁和从界面释放实现方面有其他优势(例如,您可以从基于锁的移动到使用线程安全的字典,或者反过来,而不影响调用代码)