我有一个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 中的某些内容,如果不存在,请在其中放置某些内容(我假设)。因此,问题的答案是是,您需要再次检查,代码看起来还可以。