V Javi so druge osnovne spremenljivke atomske, razen 8-bajtnih, 64-bitnih spremenljivk Long in Double.
Java model shranjevanja zahteva, da sta tako operaciji get kot store atomski, vendar za nehlapne dolge in dvojne spremenljivke JVM omogoča razdelitev 64-bitnega branja ali pisanja na dve 32-bitni operaciji.
Če se branje in pisanje dogajata na različnih niteh, lahko branje dolgega nehlapnega tipa povzroči visokih 32 bitov ene vrednosti in nizkih 32 bitov druge.
Torej, tudi če vam ni mar za potekle podatke, morda ni varno uporabljati deljenih, spremenljivih dolgih in dvojnih spremenljivk v večnitnem programu, razen če so razglašene za nestanovitne ali zaščitene z zaklepom.
Ko govorimo o atomskih operacijah, to pomeni, da sta branje in pisanje atomska, na primer i=5; To je atomska operacija.
Če pa se delovanje dveh atomov izvaja skupaj, ni nujno atomsko, na primer najprej branje in nato pisanje, potem je možno, da je bila spremenljivka po branju spremenjena.
i++ je takšna operacija, najprej preberi in nato zapiše, torej je celoštevilska spremenljivka atomska, ne pa da je i++ atomska operacija.
Ko uporabite for(int i=0; i<10000; i++){System.out.print(i)}
Ugotovili boste, da na koncu ne bom natisnil 10.000, ampak približno 8-9 tisoč.
Vendar pa v primeru večnitnosti, tudi če je celoštevilska spremenljivka atomska, lahko pride do varnostnih težav v niti, kar je problem vidnosti niti, zato je treba dodati volatilno izjavo.
Ta modifikator je prisilna spremenljivka, ki se vsakič bere iz pomnilnika in ni shranjena v registrih. |