Увеличение AtomicInteger - PullRequest
       1

Увеличение AtomicInteger

22 голосов
/ 15 декабря 2011

Что произойдет, если AtomicInteger достигнет Integer.MAX_VALUE и будет увеличено?

Возвращается ли значение к нулю?

Ответы [ 2 ]

40 голосов
/ 15 декабря 2011

Убедитесь сами:

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

Вывод:

-2147483648
-2147483648

Похоже, делает перенос в MIN_VALUE.

6 голосов
/ 15 декабря 2011

Просматривая исходный код, они просто имеют

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, если это поможет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...