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

Wei*_*Wei 1 java jvm atomic java-8

有代码:

        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();
        }
Run Code Online (Sandbox Code Playgroud)

为什么存在 println error a2 > a1

谢谢!

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

redhat windows openjdk-1.8.0.222

小智 8

想象一下这个场景

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

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

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

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

  • 从中吸取的重要教训是:仅仅因为您采取的每个操作都是原子的,并不意味着您的整个工作单元都是原子的! (4认同)