logo

Zmienne słowo kluczowe w Javie

Słowo kluczowe Volatile służy do modyfikowania wartości zmiennej przez różne wątki. Służy również do zapewnienia bezpieczeństwa wątków klas. Oznacza to, że wiele wątków może jednocześnie bez problemu korzystać z metody i instancji klas. Słowo kluczowe volatile może być używane zarówno z typem pierwotnym, jak i obiektami.

jak poznać rozmiar wyświetlacza

Słowo kluczowe volatile nie buforuje wartości zmiennej i zawsze odczytuje zmienną z pamięci głównej. Słowa kluczowego volatile nie można używać z klasami ani metodami. Jednak jest używany ze zmiennymi. Gwarantuje także widoczność i porządek. Uniemożliwia kompilatorowi zmianę kolejności kodu.

Zawartość konkretnego rejestru urządzenia może ulec zmianie w dowolnym momencie, dlatego potrzebne jest słowo kluczowe volatile, aby mieć pewność, że kompilator nie optymalizuje takich dostępów.

Przykład

 class Test { static int var=5; } 

W powyższym przykładzie załóżmy, że dwa wątki pracują na tej samej klasie. Oba wątki działają na różnych procesorach, gdzie każdy wątek ma swoją lokalną kopię var. Jeśli jakikolwiek wątek zmodyfikuje swoją wartość, zmiana nie zostanie odzwierciedlona w pierwotnym wątku w pamięci głównej. Prowadzi to do niespójności danych, ponieważ drugi wątek nie jest świadomy zmodyfikowanej wartości.

 class Test { static volatile int var =5; } 

W powyższym przykładzie zmienne statyczne są członkami klasy współdzielonymi przez wszystkie obiekty. W pamięci głównej znajduje się tylko jedna kopia. Wartość zmiennej niestabilnej nigdy nie będzie przechowywana w pamięci podręcznej. Cały odczyt i zapis będą wykonywane z i do pamięci głównej.

Kiedy go używać?

  • Możesz użyć zmiennej lotnej, jeśli chcesz automatycznie czytać i zapisywać zmienne długie i podwójne.
  • Można go używać jako alternatywnego sposobu osiągnięcia synchronizacji w Javie.
  • Wszystkie wątki czytnika zobaczą zaktualizowaną wartość zmiennej volatile po zakończeniu operacji zapisu. Jeśli nie używasz słowa kluczowego volatile, inny wątek czytelnika może zobaczyć różne wartości.
  • Służy do informowania kompilatora, że ​​wiele wątków będzie miało dostęp do określonej instrukcji. Uniemożliwia to kompilatorowi zmianę kolejności lub jakąkolwiek optymalizację.
  • Jeśli nie używasz zmiennych zmiennych, kompilator może zmienić kolejność kodu, swobodnie zapisując w pamięci podręcznej wartość zmiennej lotnej zamiast czytać z pamięci głównej.

Ważne punkty

  • Możesz użyć słowa kluczowego volatile ze zmiennymi. Używanie słowa kluczowego volatile z klasami i metodami jest nielegalne.
  • Gwarantuje to, że wartość zmiennej volatile będzie zawsze odczytywana z pamięci głównej, a nie z lokalnej pamięci podręcznej wątków.
  • Jeśli zadeklarowałeś zmienną jako zmienną, odczyt i zapis są niepodzielne
  • Zmniejsza ryzyko błędu spójności pamięci.
  • Każdy zapis do zmiennej lotnej w Javie ustanawia zdarzenie przed relacją z kolejnymi odczytami tej samej zmiennej.
  • Zmienne lotne są zawsze widoczne dla innych wątków.
  • Zmienna nietrwała będąca odwołaniem do obiektu może mieć wartość null.
  • Jeśli zmienna nie jest współużytkowana przez wiele wątków, nie ma potrzeby używania słowa kluczowego volatile z tą zmienną.

Różnica między synchronizacją a niestabilnym słowem kluczowym

Słowo kluczowe Volatile nie zastępuje słowa kluczowego synchronized, ale w niektórych przypadkach może być użyte jako alternatywa. Istnieją następujące różnice:

mój flixer
Zmienne słowo kluczowe Słowo kluczowe synchronizacji
Słowo kluczowe Volatile jest modyfikatorem pola. Synchronizowane słowo kluczowe modyfikuje bloki kodu i metody.
Wątek nie może zostać zablokowany w celu oczekiwania w przypadku niestabilności. Wątki można blokować w celu oczekiwania na synchronizację.
Poprawia wydajność wątku. Metody zsynchronizowane pogarszają wydajność wątku.
Synchronizuje wartość jednej zmiennej na raz pomiędzy pamięcią wątku a pamięcią główną. Synchronizuje wartość wszystkich zmiennych pomiędzy pamięcią wątku a pamięcią główną.
Pola lotne nie podlegają optymalizacji kompilatora. Synchronizacja podlega optymalizacji kompilatora.

Przykład niestabilnego słowa kluczowego

W poniższym przykładzie zdefiniowaliśmy klasę zwiększającą wartość licznika. Metoda run () w pliku VolatileThread.java pobiera zaktualizowaną i starą wartość, gdy wątek rozpoczyna wykonywanie. W klasie głównej definiujemy tablicę wątków.

VolatileData.java

 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

przekonwertuj liczbę całkowitą na ciąg 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;>