Co to jest synchronizacja w Javie?

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.

Scroll to Top