Jak działa ConcurrentHashMap w Javie?

ConcurrentHashMap to implementacja mapy w Javie, która umożliwia bezpieczne korzystanie z wielu wątków bez konieczności blokowania całej mapy. Jest to kluczowy element w programowaniu współbieżnym, gdzie dostęp do wspólnych zasobów musi być zarządzany efektywnie, aby uniknąć problemów takich jak wyścigi czy blokady. W tym artykule przyjrzymy się, jak ConcurrentHashMap osiąga swoją wysoką wydajność i przeanalizujemy kompletny przykład kodu.

Rozbudowany przykład użycia ConcurrentHashMap

W poniższym przykładzie zobaczymy, jak używać ConcurrentHashMap do zarządzania stanem, który jest aktualizowany przez wiele wątków. Przykład zawiera klasę Main, w której tworzona jest mapa, a następnie różne wątki dokonują w niej aktualizacji.

import java.util.concurrent.ConcurrentHashMap;

public class Main {
    public static void main(String[] args) {
        // Tworzymy ConcurrentHashMap przechowującą Integer
        ConcurrentHashMap<String, Integer> stock = new ConcurrentHashMap<>();

        // Dodajemy początkowe wartości do mapy
        stock.put("apple", 10);
        stock.put("orange", 20);

        // Tworzymy wątek aktualizujący zapasy jabłek
        Thread updateApples = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                stock.computeIfPresent("apple", (key, val) -> val + 1);
                // Zwiększamy stan jabłek o 1
                try {
                    Thread.sleep(100); // Symulacja pracy
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // Tworzymy wątek aktualizujący zapasy pomarańczy
        Thread updateOranges = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                stock.computeIfPresent("orange", (key, val) -> val + 2);
                // Zwiększamy stan pomarańczy o 2
                try {
                    Thread.sleep(100); // Symulacja pracy
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        // Uruchamiamy oba wątki
        updateApples.start();
        updateOranges.start();

        // Oczekujemy zakończenia pracy obu wątków
        try {
            updateApples.join();
            updateOranges.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Wyświetlamy końcowe stany zapasów
        stock.forEach((key, value) -> System

W tym przykładzie, ConcurrentHashMap stock jest współdzielona między dwa wątki, które aktualizują zapasy owoców. Metoda computeIfPresent jest używana do atomowego zwiększania wartości w mapie. Dzięki temu nie musimy się martwić o ryzyko wystąpienia wyścigów czy błędów spójności podczas aktualizacji.

Podsumowanie

ConcurrentHashMap w Javie jest potężnym narzędziem do zarządzania danymi w środowisku wielowątkowym, eliminując potrzebę synchronizacji na całym obiekcie i zamiast tego umożliwiając efektywną i bezpieczną aktualizację poszczególnych elementów. Wykorzystanie metod takich jak computeIfPresent pozwala na bezpieczne operacje aktualizacyjne, które są kluczowe w środowiskach produkcyjnych o wysokiej wydajności.

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