Lassen Sie uns das folgende Stück Code in Java betrachtenflüchtigen vs nicht flüchtigen
int x = 0;
int who = 1
Thread #1:
(1) x++;
(2) who = 2;
Thread #2
while(who == 1);
x++;
print x; (the value should be equal to 2 but, perhaps, it is not*)
(ich weiß nicht, Java Speicher modell- ich meine Models- lassen vermuten, dass es starke Erinnerung ist: (1) und (2) wird nicht vertauscht)
Java-Speicher-Modell garantiert, dass Zugriff/Speicherung auf die 32-Bit-Variablen atomaren ist, so dass unser Programm sicher ist. Aber trotzdem sollten wir ein Attribut volatile
wegen * verwenden. Der Wert x
kann gleich 1
sein, da x
im Register gespeichert werden kann, wenn Thread#2
gelesen wird. Um es zu lösen, sollten wir die x
Variable volatile
machen. Alles klar.
Aber, was über diese Situation:
int x = 0;
mutex m; (just any mutex)
Thread #1:
mutex.lock()
x++;
mutex.unlock()
Thread #2
mutex.lock()
x++;
print x; // the value is always 2, why**?
mutex.unlock()
Der Wert von x
ist immer 2
obwohl wir es nicht volatile
machen. Verstehe ich richtig, dass das Sperren/Entsperren von Mutex mit dem Einfügen von Speicherbarrieren verbunden ist?
Bitte poste ein MCVE. –
Was ist ein MCVE? – Gilgamesz
Lies darüber [hier] (https://StackOverflow.com/Help/Mcve) –