Sobes.tech
Middle+

Czym jest słowo kluczowe volatile w Java i jak jest używane?

sobes.tech AI

Odpowiedź od AI

volatile gwarantuje widoczność zmian zmiennej dla wszystkich wątków.

  • Gwarancja widoczności: Gdy jeden wątek zmienia zmienną volatile, inne wątki gwarantują zobaczenie tej zmiany. Bez volatile zmiany mogą pozostać w pamięci podręcznej wątku, nie synchronizując się z pamięcią główną.
  • Nie atomowa: volatile nie gwarantuje atomowości operacji. Operacje typu inkrementacji (i++) nie są atomowe i mogą prowadzić do warunków wyścigu nawet z volatile.

Używa się do:

  • Flagów stanu: Gdy jeden wątek ustawia flagę, aby poinformować inne wątki o jakimś stanie.
  • Prostych operacji odczytu/zapisu: Gdy operacje na zmiennej polegają na pojedynczym zapisie przez jeden wątek i wielokrotnym odczycie przez inne.

Przykład użycia z flagą:

// Przykład użycia volatile dla flagi zakończenia
public class VolatileExample {
    private volatile boolean terminated = false;

    public void start() {
        new Thread(() -> {
            while (!terminated) {
                // Praca wątku
                System.out.println("Wątek działa...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
            System.out.println("Wątek zakończony.");
        }).start();
    }

    public void stop() {
        terminated = true; // Zmiana zmiennej volatile
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileExample example = new VolatileExample();
        example.start();
        Thread.sleep(500);
        example.stop();
    }
}