java - 同步写入两个集合

标签 java concurrency atomic

如果 map 还不存在,我需要为 map 赋予一些值(value)。 key->value(如果设置)应该总是在两个集合中(即 put 应该原子地发生在两个映射中)。我尝试按如下方式实现:

private final ConcurrentMap<String, Object> map1 = new ConcurrentHashMap<String, Object>();
private final ConcurrentMap<String, Object> map2 = new ConcurrentHashMap<String, Object>();

public Object putIfAbsent(String key) {
    Object retval = map1.get(key);
    if (retval == null) {
        synchronized (map1) {
            retval = map1.get(key);
            if (retval == null) {
                Object value = new Object(); //or get it somewhere
                synchronized (map2) {
                    map1.put(key, value);
                    map2.put(key, new Object());
                }
                retval = value;
            }
        }
    }
    return retval;
}

public void doSomething(String key) {
    Object obj1 = map1.get(key);
    Object obj2 = map2.get(key);
    //do smth
}

在所有情况下都能正常工作吗?谢谢

最佳答案

几个问题:

  • 不要使用“双重检查锁定”。快速谷歌搜索将显示大量文章,这些文章解释了这种技术的问题。只需检查 synchronized阻止。
  • 你不需要同步map1map2 .只使用其中之一。
  • doSomething 内同步.确保在用于同步的相同对象上进行同步 putIfAbsent .

关于java - 同步写入两个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12789737/

相关文章:

java - 使用 forEach 和 Stream 的优缺点

java - 如何访问 JSP scriptlet 中的模型属性字段?

go - Golang 中的多个发送者到单个 channel

sql - 使用简单更新的计数器列的原子增量

thread-safety - ARM中的原子操作

java - 如何在 Java 中安全地访问数组线程?

java - 在不使用 JStack 的情况下从卡住的 Java 应用程序获取线程转储

java - Java 中多线程的单元测试框架

haskell - 为什么 MVar 不适用于 `par` ?

c - OSAtomicCompareAndSwapPtrBarrier 的适当转换