Voglio sapere la differenza tra set() e compareAndSet() nelle classi atomiche. Il metodo set() garantisce anche il processo atomico? Ad esempio questo codice:Java Atomic set variabile() vs compareAndSet()
public class sampleAtomic{
private static AtomicLong id = new AtomicLong(0);
public void setWithSet(long newValue){
id.set(newValue);
}
public void setWithCompareAndSet(long newValue){
long oldVal;
do{
oldVal = id.get();
}
while(!id.compareAndGet(oldVal,newValue)
}
}
I due metodi sono identici?
Grazie per la risposta. Ho dimenticato di controllare il codice sorgente. Hai ragione nel dire che il metodo set è atomico, ma il motivo non è perché ha solo una operazione. Le classi automatiche hanno una variabile membro chiamata value e quella variabile è volatile (quella nel corpo del metodo set sopra), quindi il metodo set dovrebbe essere thread-safe. –
Sei sicuro che le classi 'Atomic' sono atomiche perché usano variabili volatili per mantenere i loro stati interni. Se si definisce una variabile volatile 'volatile long value', un'operazione come' value ++ 'è atomica? E la risposta è no. Questa operazione non è atomica; in realtà sono tre operazioni distinte: recupera il valore, ne aggiunge uno, riporta il valore aggiornato. Nel frattempo, un altro thread può cambiare il valore. Quindi avere una variabile 'volatile' non garantisce l'atomicità. Un'operazione/processo è 'atomic', se forniscono supporto per gli aggiornamenti atomici. –
Ora, l'opzione 'set' è atomica, perché ha una sola operazione:' value = newValue; 'ed è atomica anche se' value' non è definito 'volatile'. Qui 'value' è stato definito' volatile' per usare la garanzia di visibilità che forniscono - le modifiche apportate da un thread sono sempre visibili agli altri thread. –