logo

Paraula clau volàtil en Java

La paraula clau volàtil s'utilitza per modificar el valor d'una variable mitjançant diferents fils. També s'utilitza per fer que les classes siguin segures. Significa que diversos fils poden utilitzar un mètode i una instància de les classes al mateix temps sense cap problema. La paraula clau volàtil es pot utilitzar amb tipus primitiu o amb objectes.

La paraula clau volàtil no guarda a la memòria cau el valor de la variable i sempre llegeix la variable de la memòria principal. La paraula clau volàtil no es pot utilitzar amb classes o mètodes. Tanmateix, s'utilitza amb variables. També garanteix la visibilitat i la comanda. Impedeix que el compilador reordena el codi.

com esborrar la columna a postgresql

El contingut del registre del dispositiu en particular pot canviar en qualsevol moment, de manera que necessiteu la paraula clau volàtil per assegurar-vos que aquests accessos no estiguin optimitzats pel compilador.

Exemple

 class Test { static int var=5; } 

A l'exemple anterior, suposeu que dos fils treballen a la mateixa classe. Tots dos fils s'executen en processadors diferents on cada fil té la seva còpia local de var. Si algun fil modifica el seu valor, el canvi no es reflectirà en l'original a la memòria principal. Comporta una inconsistència de dades perquè l'altre fil no és conscient del valor modificat.

 class Test { static volatile int var =5; } 

A l'exemple anterior, les variables estàtiques són membres de classe que es comparteixen entre tots els objectes. Només hi ha una còpia a la memòria principal. El valor d'una variable volàtil mai s'emmagatzemarà a la memòria cau. Tota la lectura i escriptura es farà des i cap a la memòria principal.

Quan utilitzar-lo?

  • Podeu utilitzar una variable volàtil si voleu llegir i escriure variables llargues i dobles automàticament.
  • Es pot utilitzar com a forma alternativa d'aconseguir la sincronització a Java.
  • Tots els fils del lector veuran el valor actualitzat de la variable volàtil després de completar l'operació d'escriptura. Si no utilitzeu la paraula clau volàtil, és possible que un fil de lector diferent vegi valors diferents.
  • S'utilitza per informar al compilador que diversos fils accediran a una instrucció determinada. Impedeix que el compilador faci cap reordenació o cap optimització.
  • Si no utilitzeu el compilador de variables volàtils, podeu reordenar el codi, podeu escriure el valor de memòria cau de la variable volàtil en lloc de llegir des de la memòria principal.

Punts importants

  • Podeu utilitzar la paraula clau volàtil amb variables. L'ús de paraules clau volàtils amb classes i mètodes és il·legal.
  • Garanteix que el valor de la variable volàtil sempre es llegirà des de la memòria principal, no des de la memòria cau del fil local.
  • Si heu declarat la variable com a volàtil, Read i Writes són atòmiques
  • Redueix el risc d'error de consistència de memòria.
  • Qualsevol escriptura a una variable volàtil a Java estableix un succés abans de la relació amb lectures successives d'aquesta mateixa variable.
  • Les variables volàtils sempre són visibles per a altres fils.
  • La variable volàtil que és una referència d'objecte pot ser nul·la.
  • Quan una variable no es comparteix entre diversos fils, no cal que utilitzeu la paraula clau volàtil amb aquesta variable.

Diferència entre sincronització i paraula clau volàtil

La paraula clau volàtil no és un substitut de la paraula clau sincronitzada, però es pot utilitzar com a alternativa en determinats casos. Hi ha les següents diferències són les següents:

Paraula clau volàtil Paraula clau de sincronització
La paraula clau volàtil és un modificador de camp. La paraula clau sincronitzada modifica els blocs de codi i els mètodes.
El fil no es pot bloquejar per esperar en cas de volàtil. Els fils es poden bloquejar per esperar en cas de sincronització.
Millora el rendiment del fil. Els mètodes sincronitzats degraden el rendiment del fil.
Sincronitza el valor d'una variable a la vegada entre la memòria del fil i la memòria principal. Sincronitza el valor de totes les variables entre la memòria del fil i la memòria principal.
Els camps volàtils no estan subjectes a l'optimització del compilador. La sincronització està subjecta a l'optimització del compilador.

Exemple de paraula clau volàtil

En l'exemple següent, hem definit una classe que augmenta el valor del comptador. El mètode run () del VolatileThread.java obté el valor actualitzat i el valor antic quan el fil comença l'execució. A la classe principal, definim la matriu de fils.

VolatileData.java

punt de primavera
 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;>