logo

Haihtuva avainsana Javassa

Haihtuvaa avainsanaa käytetään muuttujan arvon muokkaamiseen eri säikeillä. Sitä käytetään myös luokkien langan turvallisuuden parantamiseen. Se tarkoittaa, että useat säikeet voivat käyttää luokkien menetelmää ja ilmentymää samanaikaisesti ilman ongelmia. Haihtuvaa avainsanaa voidaan käyttää joko primitiivisen tyypin tai objektien kanssa.

Haihtuva avainsana ei tallenna muuttujan arvoa välimuistiin ja lukee muuttujan aina päämuistista. Haihtuvaa avainsanaa ei voi käyttää luokkien tai menetelmien kanssa. Sitä käytetään kuitenkin muuttujien kanssa. Se takaa myös näkyvyyden ja tilauksen. Se estää kääntäjää järjestämästä koodia uudelleen.

a b c numeroita

Tietyn laiterekisterin sisältö voi muuttua milloin tahansa, joten tarvitset haihtuvaa avainsanaa varmistaaksesi, että kääntäjä ei optimoi tällaisia ​​​​käyttöjä.

Esimerkki

 class Test { static int var=5; } 

Yllä olevassa esimerkissä oletetaan, että kaksi säiettä työskentelee samassa luokassa. Molemmat säikeet toimivat eri prosessoreissa, joissa jokaisella säikeellä on paikallinen kopio var. Jos jokin säikeistä muuttaa sen arvoa, muutos ei heijastu alkuperäiseen päämuistiin. Se johtaa tietojen epäjohdonmukaisuuteen, koska toinen säie ei ole tietoinen muokatusta arvosta.

 class Test { static volatile int var =5; } 

Yllä olevassa esimerkissä staattiset muuttujat ovat luokan jäseniä, jotka jaetaan kaikkien objektien kesken. Päämuistissa on vain yksi kopio. Haihtuvan muuttujan arvoa ei koskaan tallenneta välimuistiin. Kaikki luku- ja kirjoitus tapahtuu päämuistista ja siihen.

Milloin sitä käytetään?

  • Voit käyttää haihtuvaa muuttujaa, jos haluat lukea ja kirjoittaa pitkän ja kaksinkertaisen muuttujan automaattisesti.
  • Sitä voidaan käyttää vaihtoehtoisena tapana saavuttaa synkronointi Javassa.
  • Kaikki lukijan säikeet näkevät haihtuvan muuttujan päivitetyn arvon kirjoitustoiminnon suorittamisen jälkeen. Jos et käytä haihtuvaa avainsanaa, eri lukijaketju voi nähdä erilaisia ​​arvoja.
  • Sitä käytetään ilmoittamaan kääntäjälle, että useat säikeet voivat käyttää tiettyä käskyä. Se estää kääntäjää tekemästä uudelleenjärjestelyjä tai optimointia.
  • Jos et käytä haihtuvaa muuttujaa, kääntäjä voi järjestää koodin uudelleen, vapaasti kirjoittaa haihtuvan muuttujan välimuistiin sen sijaan, että se lukisi päämuistista.

Tärkeitä kohtia

  • Voit käyttää volatile-avainsanaa muuttujien kanssa. Haihtuvien avainsanojen käyttö luokkien ja menetelmien kanssa on laitonta.
  • Se takaa, että haihtuvan muuttujan arvo luetaan aina päämuistista, ei paikallisesta säikeen välimuistista.
  • Jos määritit muuttujan haihtuvaksi, luku- ja kirjoitustoiminnot ovat atomisia
  • Se vähentää muistin johdonmukaisuusvirheen riskiä.
  • Mikä tahansa kirjoitus haihtuvaan muuttujaan Javassa muodostaa tapahtuman ennen kuin suhde saman muuttujan peräkkäisiin lukuihin.
  • Muuttujat näkyvät aina muille säikeille.
  • Haihtuva muuttuja, joka on objektiviittaus, voi olla tyhjä.
  • Kun muuttujaa ei jaeta useiden säikeiden kesken, sinun ei tarvitse käyttää volatile-avainsanaa kyseisen muuttujan kanssa.

Ero synkronoinnin ja haihtuvan avainsanan välillä

Haihtuva avainsana ei korvaa synkronoitua avainsanaa, mutta sitä voidaan käyttää vaihtoehtona tietyissä tapauksissa. Seuraavat erot ovat seuraavat:

Haihtuva avainsana Synkronointiavainsana
Haihtuva avainsana on kentän muokkaaja. Synkronoitu avainsana muokkaa koodilohkoja ja menetelmiä.
Lankaa ei voi estää odottamaan, jos se on epävakaa. Säikeet voidaan estää odottamaan synkronoinnin yhteydessä.
Se parantaa langan suorituskykyä. Synkronoidut menetelmät heikentävät langan suorituskykyä.
Se synkronoi yhden muuttujan arvon kerrallaan säiemuistin ja päämuistin välillä. Se synkronoi kaikkien muuttujien arvon säiemuistin ja päämuistin välillä.
Haihtuvat kentät eivät ole kääntäjän optimoinnin alaisia. Synkronointi edellyttää kääntäjän optimointia.

Esimerkki haihtuvasta avainsanasta

Seuraavassa esimerkissä olemme määrittäneet luokan, joka kasvattaa laskurin arvoa. Run () -menetelmä VolatileThread.javassa saa päivitetyn arvon ja vanhan arvon, kun säiettä alkaa suorittaa. Pääluokassa määrittelemme lankajoukon.

VolatileData.java

mikä on automaattinen langallinen javassa
 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;>