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
并为真。
简短回答:其他线程可以a1
在int v2 = a2.decrementAndGet()
和之间递减if(v2>a1.get())