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.