Hvad sker der, hvis en flygtig variabel skrives fra 2 tråde?
Det er fordi læs-modificer-skriv-operationer på flygtige variabler ikke er atomare. v++
er faktisk noget i stil med:
r1 = v;
r2 = r1 + 1;
v = r2;
Så hvis du har to tråde, der udfører denne operation én gang hver, kan det muligvis resultere i, at variablen kun øges én gang, da de begge læser den gamle værdi. Det er et eksempel på, hvorfor det ikke er sikkert.
I dit eksempel ville det ikke være sikkert, hvis du fjernede synkroniseret, gjorde feltet flygtigt og havde to tråde, der kalder setValue efter noget betinget logik baseret på returneringen af getValue - værdien kunne være blevet ændret af den anden tråd.
Hvis du vil have atomoperationer, se java.util.concurrent.atomic
pakke.
Søgeordet volatile
bruges til at sikre, at ændringer i din Object
vil blive set af andre Thread
s. Dette håndhæver ikke, at ikke-atomare operationer på Object
vil blive udført uden en anden Thread
forstyrrer, før handlingen er afsluttet. For at håndhæve dette skal du bruge nøgleordet synchronized
.