我有一类具有庞大的静态数据结构的类。并且许多线程可能正在并行读取访问它。建议我使用Collections.synchronizedMap

私有静态映射> HashSets =
    Collections.synchronizedMap(新的HashMap                                  HashSet >());

按照http://download.oracle.com/javase/6/docs/api/的要求,我在访问值时需要使用synced()关键字,对此我不太了解。

我应该如何修改以下访问权限:

if (HashSets.get (lang).contains (st))

if (HashSets.containsKey (lang) == false)

HashSets.put (lang, testhashset);


任何详细解释的链接都将很有用。

谢谢,

最佳答案

如果要保护所有小地图,则每当操作大地图(或其他方便全局访问的对象)时,都需要锁定它们。只需访问大地图本身的单个方法调用就可以了,因为它是同步的。但是第一个电话必须是

synchronized(HashSets) {
    if (HashSets.get(lang).contains(st)) ...
}


遍历任何地图的键时,您还需要锁定大地图,否则将冒ConcurrentModificationException的风险。

正如另一位海报指出的那样,这不是一个很好的设计。即使您使它工作,性能也将很差,因为单个大锁将大大降低并发性。一个ConcurrentHashMap持有少量ConcurrentHashMap会是一个更好的主意。

关于java - Java中Collections.synchronizedMap的基础,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7993971/

10-09 05:20