Java >> Java tutorial >  >> Tag >> volatile

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 .


Java tag