我定义了以下实例变量:
private final AtomicInteger tradeCounter = new AtomicInteger(0);
我有一个名为onTrade的方法,定义如下,由6个线程调用:
public void onTrade(Trade trade) {
System.out.println(tradeCounter.incrementAndGet());
}
为什么输出:
2个
5
4
3
1个
6
代替
1个
2个
3
4
5
6
?
我想避免使用同步。
最佳答案
你可以想到
tradeCounter.incrementAndGet();
和
System.out.println();
作为两个单独的陈述。
所以在这里
System.out.println(tradeCounter.incrementAndGet());
基本上有两个语句,这些语句不是原子的。
想象一下这样的示例,其中有2个线程:
tradeCounter.incrementAndGet()
tradeCounter.incrementAndGet()
这完全取决于线程将在您的方法中调用指令的顺序。
关于java - 原子整数计数器打印顺序错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56281452/