Ho il seguente nella mia classe:La semplice chiamata getter su operazioni atomiche variabili volatili?
private static volatile byte counter = 0;
public static byte getCounter() {return counter;}
è la chiamata alla getCounter
atomica, o no?
Ho il seguente nella mia classe:La semplice chiamata getter su operazioni atomiche variabili volatili?
private static volatile byte counter = 0;
public static byte getCounter() {return counter;}
è la chiamata alla getCounter
atomica, o no?
Sì, è un'operazione atomica, nel senso che non può esserci alcun riordino o temporizzazione che causerà la lettura del byte mentre viene scritta parzialmente. Se il byte viene riassegnato mentre viene letto, il getter è garantito per restituire il valore before o after, ma nessun altro valore, anche senza volatile
.
Tuttavia, è must avete volatile
su un valore doppio o lungo per evitare di essere incoerente legge che non sono né il vecchio né il nuovo valore:
Ai fini del modello di memoria linguaggio di programmazione Java, una singola scrittura su un valore lungo o doppio non volatile viene trattata come due scritture separate: una per ciascuna metà a 32 bit. Ciò può comportare una situazione in cui un thread vede i primi 32 bit di un valore a 64 bit da una scrittura e il secondo 32 bit da un'altra scrittura.
Le implementazioni della Java Virtual Machine sono consigliate per evitare di dividere i valori a 64 bit laddove possibile. I programmatori sono invitati a dichiarare valori a 64 bit condivisi come
volatile
o sincronizzare correttamente i loro programmi per evitare possibili complicazioni.
Fonte: JLS8 section 17.7
@RealSkeptic Giusto, non ho preso la parola chiave 'volatile' nel post dell'OP. – hexafraction
Sì. Thatz lo scopo di volatile. Curioso di vedere se la mia comprensione è corretta .... –
In realtà, lo scopo di volatile è quello di garantire che qualsiasi scrittura da un thread alla variabile volatile sarà visibile dalle successive letture da altri thread. La lettura/assegnazione di un byte è atomica, con o senza volatile. –
Si noti che questo ragionamento non vale con 'long' e' double' –