Ответ 1
Из-за целочисленного переполнения оно оборачивается в Integer.MIN_VALUE
:
System.out.println(new AtomicInteger(Integer.MAX_VALUE).incrementAndGet());
System.out.println(Integer.MIN_VALUE);
Выход:
-2147483648
-2147483648
Что произойдет, если AtomicInteger
достигает Integer.MAX_VALUE
и увеличивается?
Возвращается ли значение к нулю?
Из-за целочисленного переполнения оно оборачивается в Integer.MIN_VALUE
:
System.out.println(new AtomicInteger(Integer.MAX_VALUE).incrementAndGet());
System.out.println(Integer.MIN_VALUE);
Выход:
-2147483648
-2147483648
Бросив исходный код, они просто имеют
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, если это поможет.
см. также Что происходит, когда вы увеличиваете целое число за пределами его максимального значения?