AtomicInteger
работает с двумя понятиями: CAS и volatile
переменная.Как работает «Сравнить и устанавливать» в AtomicInteger
Использование переменной volatile
гарантирует, что текущее значение будет видимым для всех потоков, и оно не будет кэшироваться.
Но я путать над CAS (сравнить, а) концепции, которая описана ниже:
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
Мой вопрос в том, что то, что if(compareAndSet(current, next)
возвращается false
? Не изменится ли значение? В этом случае то, что будет происходить, когда поток выполняется ниже случай:
private AtomicInteger count = new AtomicInteger();
count.incrementAndGet();
http://blog.slaks.net/2013-07-22/thread-safe-data-structures/ – SLaks