Java ConcurrentHashMap操作原子性

疯狂的

这可能是一个重复的问题,但是我已经在关于并发的书中找到了这部分代码。据说这是线程安全的:

ConcurrentHashMap<String, Integer> counts = new ...;

private void countThing(String thing) {
    while (true) {
        Integer currentCount = counts.get(thing);
        if (currentCount == null) {
            if (counts.putIfAbsent(thing, 1) == null)
                break;
        } else if (counts.replace(thing, currentCount, currentCount + 1)) {
            break;
        }
    }
}

从我(并发初学者)的角度来看,线程t1和线程t2都可以读取currentCount = 1然后,两个线程都可以将地图的值更改为2。如果代码正确,是否有人可以向我解释?

伊沙维特

诀窍是replace(K key, V oldValue, V newValue)为您提供原子性。文档(重点是我的):

当当前映射到给定值时,替换键的条目...该操作是原子执行的。

关键字是“原子地”。在其中replace,“检查旧值是否是我们期望的值,并且只有在需要的时候才将其替换”发生在单个工作块中,没有其他线程能够与它交织。实现需要由它来实现它所需的任何同步,以确保它提供了这种原子性。

因此,不可能两个线程都currentAction == 1replace函数内部看到其中之一将其视为1,因此对其的调用replace将返回true。另一个将其视为2(因为第一次调用),因此返回false-并使用新值循环返回以重试currentAction == 2

当然,这可能是第三个线程同时将currentAction更新为3,在这种情况下,第二个线程将一直尝试直到幸运的是没有任何人跳到它前面。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Couchbase(Java SDK)中Add操作的原子性

来自分类Dev

Couchbase(Java SDK)中的Add操作的原子性

来自分类Dev

原子操作是否需要Java中的同步

来自分类Dev

如何解决findbug调用java.util.concurrent.ConcurrentHashMap的顺序可能不是原子的

来自分类Dev

Findbugs-调用java.util.concurrent.ConcurrentHashMap的顺序可能不是原子的

来自分类Dev

才能实现在Java中写入原子中的ConcurrentHashMap后的可变数据读取?

来自分类Dev

Findbugs-调用java.util.concurrent.ConcurrentHashMap的顺序可能不是原子的

来自分类Dev

Java Atomics是否只需要相对于VM的原子性

来自分类Dev

如何确保VxWorks结构操作中的原子性?

来自分类Dev

子流程执行的顺序及其对操作原子性的影响

来自分类Dev

Java中的ConcurrentHashMap困境

来自分类Dev

Java:整数的原子元组

来自分类Dev

Scala有序/ Java可比互操作性

来自分类Dev

平台无关的Java <-> C#互操作性

来自分类Dev

Scala有序/ Java可比的互操作性

来自分类Dev

ConcurrentHashMap:在 Java 中对嵌套的 concurrentHashMap 使用 merge()

来自分类Dev

在Java中,当Long,long,Double,double之类的变量自动装箱或拆箱时,读写操作是原子的吗?

来自分类Dev

互操作:Java <-> Java

来自分类Dev

Java:什么是原子数?

来自分类Dev

Java多线程原子分配

来自分类Dev

在Java中创建原子RingBuffer

来自分类Dev

Java多线程原子分配

来自分类Dev

ConcurrentHashMap及其操作

来自分类Dev

浮子上的原子操作

来自分类Dev

Sequelize中的原子操作

来自分类Dev

MongoDB,原子级操作

来自分类Dev

Android文件原子操作

来自分类Dev

Sequelize中的原子操作

来自分类Dev

Javascript原子系列操作

Related 相关文章

热门标签

归档