使用ConcurrentHashMap,何时需要同步?
问题内容:
我有一个ConcurrentHashMap,在其中执行以下操作:
sequences = new ConcurrentHashMap<Class<?>, AtomicLong>();
if(!sequences.containsKey(table)) {
synchronized (sequences) {
if(!sequences.containsKey(table))
initializeHashMapKeyValue(table);
}
}
我的问题是-是否有必要做多余的事情
if(!sequences.containsKey(table))
检查同步块内部,以便其他线程不会初始化相同的哈希图值?
也许检查是必要的,但我做错了吗?我在做什么似乎有点可笑,但我认为这是必要的。
问题答案:
*ConcurrentHashMap上的 *所有
操作都是线程安全的,但是线程安全的操作是不可组合的。您试图使原子操作成为一对操作:检查地图中的某些内容,如果不存在,请在其中放置某些内容(我认为)。因此,问题的答案是
肯定的 ,您需要再次检查,代码看起来还可以。