AtomicIntegera1在a2之前增加,在a2之后减少,为什么存在a2>a1

有代码:

        AtomicInteger a1 = new AtomicInteger();
        AtomicInteger a2 = new AtomicInteger();
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                for (int j = 0; j < 1e4; j++) {
                    a1.incrementAndGet();
                    a2.incrementAndGet();
                    int v2 = a2.decrementAndGet();
                    if(v2>a1.get()){
                        System.out.println("error a2 > a1");
                    }
                    a1.decrementAndGet();
                }
            }).start();
        }

为什么存在 println error a2 > a1

谢谢!

行动 a1 a2
a1+ 1 0
a2+ 1 1
a2- 1 0
a1- 0 0

回答

想象一下这个场景

所有 100 个线程都完成了增量,最后一个线程现在具有a1 = 100, a2 = 100.

现在计算 v2 的第一个线程将得到v2 = 99.

如果其他 99 个线程在该线程进一步运行之前完成并递减,则它将被检查99 > 1并为真。

简短回答:其他线程可以a1int v2 = a2.decrementAndGet()和之间递减if(v2>a1.get())

  • And the great lesson to take from this: just because each action you take is atomic does **not** mean that your whole unit of work is atomic!

以上是AtomicIntegera1在a2之前增加,在a2之后减少,为什么存在a2&gt;a1的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>