logo

Nepastāvīgs atslēgvārds Java valodā

Nepastāvīgs atslēgvārds tiek izmantots, lai mainītu mainīgā vērtību ar dažādiem pavedieniem. To izmanto arī, lai padarītu klases pavedienus drošus. Tas nozīmē, ka vairāki pavedieni bez problēmām var vienlaikus izmantot klašu metodi un gadījumu. Gaistošo atslēgvārdu var izmantot vai nu ar primitīvu veidu, vai ar objektiem.

Nepastāvīgais atslēgvārds nesaglabā mainīgā vērtību kešatmiņā un vienmēr nolasa mainīgo no galvenās atmiņas. Nepastāvīgo atslēgvārdu nevar izmantot ar klasēm vai metodēm. Tomēr to izmanto ar mainīgajiem. Tas arī garantē redzamību un pasūtījumu. Tas neļauj kompilatoram pārkārtot kodu.

java salīdzināt virknes

Konkrētā ierīču reģistra saturs var mainīties jebkurā laikā, tāpēc jums ir nepieciešams nepastāvīgs atslēgvārds, lai nodrošinātu, ka kompilators šādas piekļuves neoptimizē.

Piemērs

 class Test { static int var=5; } 

Iepriekš minētajā piemērā pieņemsim, ka divi pavedieni strādā vienā klasē. Abi pavedieni darbojas dažādos procesoros, kur katram pavedienam ir sava lokālā var kopija. Ja kāds pavediens maina tā vērtību, izmaiņas neatspoguļosies sākotnējā galvenajā atmiņā. Tas rada datu nekonsekvenci, jo otrs pavediens nezina modificēto vērtību.

 class Test { static volatile int var =5; } 

Iepriekš minētajā piemērā statiskie mainīgie ir klases dalībnieki, kas tiek koplietoti starp visiem objektiem. Galvenajā atmiņā ir tikai viena kopija. Nepastāvīga mainīgā vērtība nekad netiks saglabāta kešatmiņā. Viss lasīšana un rakstīšana tiks veikta no un uz galveno atmiņu.

Kad to lietot?

  • Varat izmantot nepastāvīgu mainīgo, ja vēlaties automātiski lasīt un rakstīt garu un dubultu mainīgo.
  • To var izmantot kā alternatīvu veidu, kā panākt sinhronizāciju Java.
  • Pēc rakstīšanas darbības pabeigšanas visi lasītāja pavedieni redzēs atjaunināto mainīgā mainīgā vērtību. Ja neizmantojat nepastāvīgo atslēgvārdu, dažādi lasītāja pavedieni var redzēt dažādas vērtības.
  • To izmanto, lai informētu kompilatoru, ka vairāki pavedieni piekļūs konkrētam paziņojumam. Tas neļauj kompilatoram veikt jebkādu pārkārtošanu vai optimizāciju.
  • Ja neizmantojat gaistošu mainīgo, kompilators var pārkārtot kodu, brīvi rakstīt kešatmiņā mainīgā mainīgā vērtību, nevis lasīt no galvenās atmiņas.

Svarīgi punkti

  • Varat izmantot mainīgo atslēgvārdu ar mainīgajiem. Nepastāvīgu atslēgvārdu izmantošana klasēm un metodēm ir nelikumīga.
  • Tas garantē, ka mainīgā mainīgā vērtība vienmēr tiks nolasīta no galvenās atmiņas, nevis no vietējā pavediena kešatmiņas.
  • Ja deklarējāt mainīgo kā nepastāvīgu, lasīšanas un rakstīšanas opcijas ir atomāras
  • Tas samazina atmiņas konsekvences kļūdu risku.
  • Jebkurš rakstīšana uz gaistošu mainīgo Java nosaka, ka notiek pirms attiecības ar tā paša mainīgā secīgiem lasījumiem.
  • Nepastāvīgie mainīgie vienmēr ir redzami citiem pavedieniem.
  • Nepastāvīgais mainīgais, kas ir objekta atsauce, var būt nulle.
  • Ja mainīgais netiek koplietots starp vairākiem pavedieniem, jums nav jāizmanto mainīgais atslēgvārds ar šo mainīgo.

Atšķirība starp sinhronizāciju un nepastāvīgu atslēgvārdu

Nepastāvīgs atslēgvārds neaizstāj sinhronizēto atslēgvārdu, taču noteiktos gadījumos to var izmantot kā alternatīvu. Pastāv šādas atšķirības:

Nepastāvīgs atslēgvārds Sinhronizācijas atslēgvārds
Nepastāvīgs atslēgvārds ir lauka modifikators. Sinhronizēts atslēgvārds maina kodu blokus un metodes.
Pavedienu nevar bloķēt gaidīšanai nepastāvības gadījumā. Sinhronizācijas gadījumā pavedienus var bloķēt gaidīšanai.
Tas uzlabo vītnes veiktspēju. Sinhronizētās metodes pasliktina pavedienu veiktspēju.
Tas vienlaikus sinhronizē viena mainīgā vērtību starp pavedienu atmiņu un galveno atmiņu. Tas sinhronizē visu mainīgo vērtību starp pavedienu atmiņu un galveno atmiņu.
Nepastāvīgie lauki nav pakļauti kompilatora optimizācijai. Sinhronizācija ir pakļauta kompilatora optimizācijai.

Nepastāvīga atslēgvārda piemērs

Nākamajā piemērā mēs esam definējuši klasi, kas palielina skaitītāja vērtību. Metode Run () failā VolatileThread.java iegūst atjaunināto vērtību un veco vērtību, kad pavediens sāk izpildīt. Galvenajā klasē mēs definējam pavedienu masīvu.

VolatileData.java

lateksa saraksti
 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;>