我定义了以下实例变量:

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个线程:
  • 线程1调用tradeCounter.incrementAndGet()
  • 线程2调用tradeCounter.incrementAndGet()
  • 线程2打印值2
  • 线程1打印值1

  • 这完全取决于线程将在您的方法中调用指令的顺序。

    关于java - 原子整数计数器打印顺序错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56281452/

    10-10 09:58