Czy w Javie możliwe jest zablokowanie obiektu do wyłącznego użytku przez wątek?

W wielowątkowości bardzo ważną kwestią jest zarządzanie dostępem do współdzielonych zasobów. W Javie mechanizmy synchronizacji pozwalają na kontrolę dostępu do obiektów przez różne wątki. W tym artykule przedstawimy, jak zablokować obiekt dla wyłącznego użytku przez jeden wątek, aby zapobiec problemom takim jak wyścigi czy warunki brzegowe.

Synchronizacja w Javie

W Javie słowo kluczowe synchronized może być użyte do zablokowania obiektu, tak aby tylko jeden wątek mógł wykonywać dany blok kodu w danym momencie. Gdy wątek wchodzi do bloku synchronized, automatycznie zyskuje tzw. “monitor” (lub “lock”) na obiekcie, na którym ten blok jest synchronizowany. Żaden inny wątek nie może wykonać żadnego z synchronizowanych bloków na tym samym obiekcie, dopóki pierwszy wątek nie zakończy swojego bloku i nie zwolni “locka”.

Przykład: Bank i konta

Załóżmy, że mamy aplikację bankową, gdzie wiele wątków próbuje zaktualizować saldo na tych samych kontach bankowych. Bez odpowiedniej synchronizacji, saldo na koncie może stać się nieprawidłowe z powodu jednoczesnych zmian. Oto przykład kodu, który zapewnia bezpieczne aktualizacje salda:

class BankAccount {
    private int balance; // Saldo konta

    public BankAccount(int initialBalance) {
        this.balance = initialBalance;
    }

    // Metoda do dodawania pieniędzy do konta
    public synchronized void deposit(int amount) {
        // Początkowe saldo plus kwota
        balance += amount; 
        System.out.println("Saldo po wpłacie: " + balance);
    }

    // Metoda do wypłacania pieniędzy z konta
    public synchronized void withdraw(int amount) {
        // Początkowe saldo minus kwota
        if (balance >= amount) {
            balance -= amount;
            System.out.println("Saldo po wypłacie: " + balance);
        } else {
            System.out.println("Niewystarczające środki na koncie.");
        }
    }

    // Metoda do sprawdzania salda
    public synchronized int getBalance() {
        // Zwracanie aktualnego salda
        return balance;
    }
}

Podsumowanie

Użycie synchronized w Javie pozwala na bezpieczną manipulację współdzielonymi zasobami w środowisku wielowątkowym. Dzięki temu mechanizmowi możemy uniknąć błędów związanych z równoczesnym dostępem do obiektów, co jest kluczowe w aplikacjach, gdzie dane są intensywnie przetwarzane przez wiele wątków. Mechanizm ten jest fundamentalny dla prawidłowego funkcjonowania wielu systemów wymagających wysokiego poziomu niezawodności i bezpieczeń

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