2015-06-19 27 views
6

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?

+0

Sì. Thatz lo scopo di volatile. Curioso di vedere se la mia comprensione è corretta .... –

+2

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. –

+3

Si noti che questo ragionamento non vale con 'long' e' double' –

risposta

10

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

+1

@RealSkeptic Giusto, non ho preso la parola chiave 'volatile' nel post dell'OP. – hexafraction