Jakie jest zastosowanie słowa kluczowego ‘synchronized’ w wielowątkowości Javy?

W programowaniu wielowątkowym w Javie kluczowe znaczenie ma zapewnienie bezpieczeństwa wątków podczas dostępu do współdzielonych zasobów. Jednym z narzędzi, które Java oferuje do zarządzania dostępem wątków do wspólnych zasobów, jest słowo kluczowe synchronized. To słowo kluczowe może być używane do synchronizacji bloków kodu oraz metod, aby uniknąć konfliktów i błędów wynikających z jednoczesnego dostępu wielu wątków do tego samego zasobu.

Przykład zastosowania synchronized

Załóżmy, że chcemy zbudować prosty licznik, który będzie bezpiecznie używany przez wiele wątków. Poniżej znajduje się kompletny kod w Javie z odpowiednimi komentarzami po polsku, które wyjaśniają działanie każdej części kodu.

// Klasa definiująca bezpieczny licznik
public class SafeCounter {
    private int count = 0; // Współdzielona zmienna

    // Metoda zwiększająca wartość licznika
    public synchronized void increment() {
        count++; // Zwiększenie licznika o 1
    }

    // Metoda pobierająca aktualną wartość licznika
    public synchronized int getCount() {
        return count; // Zwrócenie aktualnej wartości licznika
    }
}

// Klasa z metodą main, która uruchamia wątki
public class ThreadSafetyExample {
    public static void main(String[] args) {
        SafeCounter counter = new SafeCounter(); // Utworzenie instancji licznika

        // Utworzenie wątków używających licznika
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter.increment(); // Inkrementacja w tle
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10000; i++) {
                counter.increment(); // Inkrementacja w tle
            }
        });

        t1.start(); // Start pierwszego wątku
        t2.start(); // Start drugiego wątku

        try {
            t1.join(); // Czekanie na zakończenie wątku t1
            t2.join(); // Czekanie na zakończenie wątku t2
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Wyświetlenie wyniku działania licznika
        System.out.println("Final count: " + counter.getCount());
    }
}

W powyższym kodzie, metody increment oraz getCount są oznaczone jako synchronized. Oznacza to, że w danym momencie tylko jeden wątek może wykonywać jedną z tych metod dla danej instancji SafeCounter. Dzięki temu zapewniamy, że operacja inkrementacji licznika jest atomowa i nie zostanie zakłócona przez inny wątek, co jest kluczowe dla zachowania spójności danych w środowisku wielowątkowym.

Podsumowanie

Użycie słowa kluczowego synchronized w Javie jest fundamentalne dla zapewnienia bezpieczeństwa wątków, gdy współdzielą one dostęp do tych samych zasobów. Synchronizacja blokuje dostęp do metody lub bloku kodu dla innych wątków, dopóki wątek, który wszedł jako pierwszy, nie zakończy swojej pracy. Jest to szczególnie przydatne w aplikacjach, gdzie konsekwencja danych i unikanie kolizji są krytyczne.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top