java - java中Collections.synchronizedMap的基础知识

标签 java

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

相关文章:

java - 索引越界错误

Java 对执行的各个字节码指令进行计数

java - 以前可以使用空的 keystore 密码吗?

java - 无法在 JTextArea 中显示特定(西里尔文等)字符

java - sqlite android中的编码字符

java - IBM JRE 1.5 无法使用请求的 1.5G 内存启动

java - 将对象与反序列化对象进行比较

Java 枚举值和 SQL 注入(inject)

java - 预订系统的日期验证

java - 当 CONTENT_TYPE 为 application/json 时 Apache Camel 修改 JSON