Java int concurrency ++ int эквивалентно AtomicInteger.incrementAndGet ()? - PullRequest
9 голосов
/ 05 мая 2010

Эти два эквивалента? Другими словами, являются ли операторы ++ и - атомарными?

int i = 0;
return ++i;

AtomicInteger ai = new AtomicInteger(0);
return ai.incrementAndGet();

Ответы [ 2 ]

13 голосов
/ 05 мая 2010

Нет, ++i - это фактически три инструкции (загрузка i, приращение, сохранение в i). Это определенно не атомарно.

6 голосов
/ 05 мая 2010

Операция ++ не является атомарной в Java, потому что она состоит из трех операций

  1. Считать сохраненное значение (атомное)
  2. Добавляет один к нему (атомарный)
  3. Накопленная стоимость (атомная)

Так что определенно что-то плохое может произойти между

В случае long это еще сложнее, потому что даже сама операция чтения не является атомарной.

Я нашел хорошую статью, в которой рассказывается о модели памяти

http://www.vogella.de/articles/JavaConcurrency/article.html#memorymodel_atomic

...