使用ConcurrentHashMap,何时需要同步?


问题内容

我有一个ConcurrentHashMap,在其中执行以下操作:

sequences = new ConcurrentHashMap<Class<?>, AtomicLong>();

if(!sequences.containsKey(table)) {
    synchronized (sequences) {
        if(!sequences.containsKey(table))
            initializeHashMapKeyValue(table);
    }
}

我的问题是-是否有必要做多余的事情

if(!sequences.containsKey(table))

检查同步块内部,以便其他线程不会初始化相同的哈希图值?

也许检查是必要的,但我做错了吗?我在做什么似乎有点可笑,但我认为这是必要的。


问题答案:

*ConcurrentHashMap上的 *所有
操作都是线程安全的,但是线程安全的操作是不可组合的。您试图使原子操作成为一对操作:检查地图中的某些内容,如果不存在,请在其中放置某些内容(我认为)。因此,问题的答案是
肯定的 ,您需要再次检查,代码看起来还可以。