AtomicInteger
funziona con due concetti: CAS e variabile volatile
.Come funziona "Confronta e imposta" in AtomicInteger funziona
Utilizzando la variabile volatile
, il valore corrente sarà visibile a tutti i thread e non verrà memorizzato nella cache.
Ma io sono confuso su CAS (confrontare e set) concetto che è spiegato qui di seguito:
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return current;
}
}
La mia domanda è che cosa if(compareAndSet(current, next)
rendimenti false
? Il valore non sarà aggiornato? In questo caso che cosa accadrà quando un thread è in esecuzione il caso qui di seguito:
private AtomicInteger count = new AtomicInteger();
count.incrementAndGet();
http://blog.slaks.net/2013-07-22/thread-safe-data-structures/ – SLaks