我有一类具有庞大的静态数据结构的类。并且许多线程可能正在并行读取访问它。建议我使用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/