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

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

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

我的问题是-是否有必要做多余的事情
if(!sequences.containsKey(table))

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

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

最佳答案

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

09-26 21:37