Supponiamo di avere queste due variabili:
public int a = 0;
public volatile int b = 0;
e supponiamo un thread fa
a = 1;
b = 2;
Se un altro thread legge questi valori e vede che b == 2, quindi è garantito per vedere anche a == 1.
Ma il thread di lettura potrebbe vedere a == 1
e b == 0
, poiché le due scritture non fanno parte di un'operazione atomica, quindi il thread di lettura potrebbe vedere la modifica apportata a a
prima che il primo thread abbia assegnato un valore a .
di rendere questi due scritture atomica, si avrebbe bisogno di sincronizzare l'accesso a queste due variabili:
synchronized (lock) {
a = 1;
b = 2;
}
...
synchronized (lock) {
System.out.println("a = " + a + "; b = " + b);
}
E in questo caso, il filo di lettura vedrà a == 0
e b == 0
, o a == 1
e b == 2
, ma mai lo stato intermedio.
fonte
2013-03-17 22:32:31
Non penso che 'volatile' offra la stessa garanzia in C/C++ come in Java. In particolare, non penso che fornisca in C ciò che chiamate consistenza sequenziale (cioè che la barriera di memoria si applica ad altre variabili) - TBC. – assylias
@assylias non intendevo dire che volatile ha lo stesso significato in C/C++. Sono sicuro che non sia così.Mi riferivo al concetto di 'coerenza sequenziale e atomicità' che è comune tra c/C++ e Java. In C/C++ la parola chiave volatile interrompe l'ottimizzazione dell'utilizzo della variabile e non viene utilizzata per mantenere la coerenza sequenziale tra le operazioni specificate prima dell'operazione con una variabile volatile .. –