logo

Volatile Keyword v Javi

Ključna beseda volatile se uporablja za spreminjanje vrednosti spremenljivke v različnih nitih. Uporablja se tudi za to, da so razredi nitno varni. To pomeni, da lahko več niti brez težav uporablja metodo in primerek razredov hkrati. Ključno besedo volatile je mogoče uporabiti s primitivnim tipom ali objekti.

Ključna beseda volatile ne predpomni vrednosti spremenljivke in vedno prebere spremenljivko iz glavnega pomnilnika. Ključne besede volatile ni mogoče uporabiti z razredi ali metodami. Vendar se uporablja s spremenljivkami. Zagotavlja tudi vidnost in urejenost. Prevajalniku preprečuje preurejanje kode.

okno.odpri javascript

Vsebina določenega registra naprave se lahko kadar koli spremeni, zato potrebujete ključno besedo volatile, da zagotovite, da prevajalnik ne optimizira takih dostopov.

Primer

 class Test { static int var=5; } 

V zgornjem primeru predpostavimo, da dve niti delujeta v istem razredu. Obe niti delujeta na različnih procesorjih, kjer ima vsaka nit svojo lokalno kopijo var. Če katera koli nit spremeni svojo vrednost, se sprememba ne bo odrazila v izvirniku v glavnem pomnilniku. To vodi do nedoslednosti podatkov, ker druga nit ne pozna spremenjene vrednosti.

 class Test { static volatile int var =5; } 

V zgornjem primeru so statične spremenljivke člani razreda, ki si jih delijo vsi objekti. V glavnem pomnilniku je samo ena kopija. Vrednost volatilne spremenljivke ne bo nikoli shranjena v predpomnilniku. Vse branje in pisanje bo opravljeno iz in v glavni pomnilnik.

Kdaj ga uporabiti?

  • Nestanovitno spremenljivko lahko uporabite, če želite samodejno brati in pisati dolgo in dvojno spremenljivko.
  • Uporablja se lahko kot alternativni način za doseganje sinhronizacije v Javi.
  • Vse bralne niti bodo videle posodobljeno vrednost volatile spremenljivke po zaključku pisalne operacije. Če ne uporabljate ključne besede volatile, lahko različne niti bralcev vidijo različne vrednosti.
  • Uporablja se za obveščanje prevajalnika, da bo več niti dostopalo do določenega stavka. Prevajalniku preprečuje kakršno koli preurejanje ali optimizacijo.
  • Če ne uporabljate hlapnih spremenljivk, lahko prevajalnik preuredi kodo in prosto zapiše v predpomnilnik vrednost hlapnih spremenljivk namesto branja iz glavnega pomnilnika.

Pomembne točke

  • Ključno besedo volatile lahko uporabite s spremenljivkami. Uporaba volatile ključne besede z razredi in metodami je nezakonita.
  • Zagotavlja, da bo vrednost volatile spremenljivke vedno prebrana iz glavnega pomnilnika, ne iz lokalnega predpomnilnika niti.
  • Če ste spremenljivko razglasili za nestanovitno, sta Branje in Zapisovanje atomična
  • Zmanjša tveganje napake skladnosti pomnilnika.
  • Vsako pisanje v volatile spremenljivko v Javi vzpostavi dogodek pred razmerjem z zaporednimi branji te iste spremenljivke.
  • Hlapne spremenljivke so vedno vidne drugim nitim.
  • Hlapna spremenljivka, ki je sklic na objekt, je lahko ničelna.
  • Če spremenljivka ni v skupni rabi med več nitmi, vam s to spremenljivko ni treba uporabiti ključne besede volatile.

Razlika med sinhronizacijo in volatile ključno besedo

Volatile ključna beseda ni nadomestek za sinhronizirano ključno besedo, vendar jo je v določenih primerih mogoče uporabiti kot alternativo. Obstajajo naslednje razlike:

Nestanovitna ključna beseda Ključna beseda za sinhronizacijo
Volatile ključna beseda je modifikator polja. Sinhronizirana ključna beseda spreminja kodne bloke in metode.
Niti ni mogoče blokirati zaradi čakanja v primeru nestanovitnosti. Niti je mogoče blokirati zaradi čakanja v primeru sinhronizacije.
Izboljša delovanje niti. Sinhronizirane metode poslabšajo zmogljivost niti.
Sinhronizira vrednost ene spremenljivke naenkrat med pomnilnikom niti in glavnim pomnilnikom. Sinhronizira vrednosti vseh spremenljivk med pomnilnikom niti in glavnim pomnilnikom.
Hlapna polja niso predmet optimizacije prevajalnika. Sinhronizacija je predmet optimizacije prevajalnika.

Primer nestanovitne ključne besede

V naslednjem primeru smo definirali razred, ki poveča vrednost števca. Metoda run () v VolatileThread.java dobi posodobljeno vrednost in staro vrednost, ko se nit začne izvajati. V glavnem razredu definiramo matriko niti.

VolatileData.java

krepko besedilo css
 public class VolatileData { private volatile int counter = 0; public int getCounter() { return counter; } public void increaseCounter() { ++counter; //increases the value of counter by 1 } } 

VolatileThread.java

 VolatileThread.java public class VolatileThread extends Thread { private final VolatileData data; public VolatileThread(VolatileData data) { this.data = data; } @Override public void run() { int oldValue = data.getCounter(); System.out.println('[Thread ' + Thread.currentThread().getId() + ']: Old value = ' + oldValue); data.increaseCounter(); int newValue = data.getCounter(); System.out.println('[Thread ' + Thread.currentThread().getId() + ']: New value = ' + newValue); } } 

VolatileMain.java

 public class VolatileMain { private final static int noOfThreads = 2; public static void main(String[] args) throws InterruptedException { VolatileData volatileData = new VolatileData(); //object of VolatileData class Thread[] threads = new Thread[noOfThreads]; //creating Thread array for(int i = 0; i <noofthreads; ++i) threads[i]="new" volatilethread(volatiledata); for(int i="0;" < noofthreads; threads[i].start(); starts all reader threads threads[i].join(); wait for } pre> <p> <strong>Output:</strong> </p> <pre> [Thread 9]: Old value = 0 [Thread 9]: New value = 1 [Thread 10]: Old value = 1 [Thread 10]: New value = 2 </pre> <hr></noofthreads;>