Synchronizacja w Javie jest mechanizmem, który pozwala kontrolować dostęp do zasobów współdzielonych przez wiele wątków, zapobiegając jednocześnie problemowi zwanemu “wyścigiem” (ang. race condition), gdzie dwa lub więcej wątków próbują jednocześnie modyfikować zasób. Używanie synchronizacji jest kluczowe w programowaniu wielowątkowym, aby zapewnić spójność i poprawność danych.
Przykład użycia synchronizacji
Załóżmy, że mamy bank, w którym wiele wątków (reprezentujących klientów) próbuje jednocześnie wpłacić pieniądze na to samo konto. Bez odpowiedniej synchronizacji saldo na koncie może być nieprawidłowo zaktualizowane, ponieważ wątki mogą przesłaniać sobie wzajemnie wyniki swojej pracy. Poniżej znajduje się przykład kodu w Javie, który ilustruje, jak można użyć synchronizacji do bezpiecznego zarządzania kontem bankowym.
// Klasa reprezentująca konto bankowe
class BankAccount {
private int balance; // Saldo konta
// Konstruktor z początkowym saldem
public BankAccount(int initialBalance) {
balance = initialBalance;
}
// Metoda do wpłaty pieniędzy, synchronizowana
public synchronized void deposit(int amount) {
// Zwiększenie salda o określoną kwotę
balance += amount;
// Wyświetlenie nowego salda po wpłacie
System.out.println("Saldo po wpłacie: " + balance);
}
// Metoda zwracająca aktualne saldo
public int getBalance() {
return balance;
}
}
// Klasa reprezentująca klienta banku, który wykonuje wpłaty
class BankClient extends Thread {
private BankAccount account; // Konto bankowe klienta
private int depositAmount; // Kwota do wpłaty
// Konstruktor dla klienta banku
public BankClient(BankAccount account, int amount) {
this.account = account;
this.depositAmount = amount;
}
// Metoda run dla wątku, wykonuje wpłaty
public void run() {
// Wykonywanie wpłaty
account.deposit(depositAmount);
}
}
// Klasa główna do uruchomienia przykładu
public class Main {
public static void main(String[] args) {
// Utworzenie konta bankowego z początkowym saldem 100
BankAccount sharedAccount = new BankAccount(100);
// Utworzenie i uruchomienie wątków klientów
for (int i = 0; i < 10; i++) {
BankClient client = new BankClient(sharedAccount, 10);
client.start();
}
}
}
Podsumowanie
W omawianym przykładzie użyliśmy słowa kluczowego synchronized
w metodzie deposit()
klasy BankAccount
, aby upewnić się, że tylko jeden wątek na raz może wykonać wpłatę. Dzięki temu zabezpieczeniu, nawet jeśli wiele wątków (klientów) jednocześnie próbuje dokonać wpłaty, saldo na koncie jest poprawnie zaktualizowane bez ryzyka utraty danych. Mechanizm synchronizacji jest niezwykle ważny w aplikacjach wielowątkowych, gdzie wiele wątków współdzieli dostęp do tych samych zasobów.
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.