原子积分递增

2022-09-01 11:35:25

如果 AtomicInteger 达到并递增,会发生什么情况?Integer.MAX_VALUE

该值是否返回零?


答案 1

由于整数溢出,它环绕到:Integer.MIN_VALUE

System.out.println(new AtomicInteger(Integer.MAX_VALUE).incrementAndGet());
System.out.println(Integer.MIN_VALUE);

输出:

-2147483648
-2147483648

答案 2

在源代码中,它们只有一个

private volatile int value;

和,和不同的地方,他们从中增加或减少,例如

public final int incrementAndGet() {
   for (;;) {
      int current = get();
      int next = current + 1;
      if (compareAndSet(current, next))
         return next;
   }
}

因此,它应该遵循标准的Java整数数学,并绕行到Integer.MIN_VALUE。JavaDocs for AtomicInteger对这个问题保持沉默(从我所看到的),所以我想这种行为将来可能会改变,但这似乎极不可能。

如果有一个AtomicLong,如果这会有所帮助的话。

另请参阅将整数递增到超过其最大值时会发生什么情况?