我有一个具有巨大静态数据结构的类。并且许多线程可能会并行读取访问它。建议我使用 Collections.synchronizedMap
私有(private)静态Map <字符串,HashSet <字符串>> HashSets =
Collections.synchronizedMap(new HashMap < String,
HashSet
根据 http://download.oracle.com/javase/6/docs/api/ ,我需要在访问值时使用synchronized()关键字。我不太理解它。
我应该如何修改以下访问:
if (HashSets.get (lang).contains (st))
if (HashSets.containsKey (lang) == false)
HashSets.put (lang, testhashset);
任何详细解释的链接都应该有用。
谢谢
最佳答案
如果您想保护所有小 map ,那么您需要在操作大 map (或其他方便的全局可访问对象)时锁定它们。仅访问大 map 本身的单个方法调用就可以了,因为它是同步的。但是第一个调用必须是,即
synchronized(HashSets) {
if (HashSets.get(lang).contains(st)) ...
}
在迭代任何映射的键时,您还需要锁定大映射,否则您将面临 ConcurrentModificationException
的风险。
正如另一位海报所指出的,这不是一个很好的设计。即使你让它工作,性能也会很差,因为单个大锁会大大降低并发性。持有少量 ConcurrentHashMap
的 ConcurrentHashMap 会是一个更好的主意。
关于java - java中Collections.synchronizedMap的基础知识,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7993971/