Активация AtomicInteger

Что произойдет, если 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 для AtomicInteger молчат по этому вопросу (из того, что я видел), поэтому я предполагаю, что это поведение может измениться в будущем, но это кажется крайне маловероятным.

Существует AtomicLong, если это поможет.

см. также Что происходит, когда вы увеличиваете целое число за пределами его максимального значения?