Jaka jest różnica między kolekcją synchronizowaną a kolekcją współbieżną w Javie?

Wstęp do tematu rozróżnienia kolekcji w Java obejmuje zrozumienie dwóch kluczowych pojęć: kolekcji synchronizowanych oraz kolekcji współbieżnych. Obydwa typy kolekcji są stosowane w celu zapewnienia bezpiecznego dostępu do elementów w środowiskach wielowątkowych, ale różnią się zarówno metodami implementacji, jak i efektywnością działania w różnych scenariuszach.

Przykład użycia kolekcji synchronizowanej i współbieżnej

Zacznijmy od stworzenia przykładu, który pokaże różnice w działaniu obu typów kolekcji. Przykład obejmie scenariusz, gdzie wielu użytkowników próbuje jednocześnie dodać elementy do kolekcji.

import java.util.*;
import java.util.concurrent.*;

public class CollectionExample {
    public static void main(String[] args) {
        // Utworzenie synchronizowanej kolekcji
        List<String> syncList = Collections.synchronizedList(new ArrayList<>());
        
        // Utworzenie kolekcji współbieżnej
        ConcurrentMap<Integer, String> concurrentMap = new ConcurrentHashMap<>();
        
        // Dodawanie elementów w wielu wątkach do synchronizowanej kolekcji
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                syncList.add("Element " + i); // Dodanie elementu
            }
        });

        // Dodawanie elementów w wielu wątkach do kolekcji współbieżnej
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                concurrentMap.put(i, "Element " + i); // Wstawianie pary klucz-wartość
            }
        });
        
        // Start wątków
        thread1.start();
        thread2.start();

        try {
            thread1.join(); // Czekanie na zakończenie wątku
            thread2.join(); // Czekanie na zakończenie wątku
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Rozmiar synchronizowanej listy: " + syncList.size());
        System.out.println("Rozmiar mapy współbieżnej: " + concurrentMap.size());
    }
}

Komentarze do kodu:

  1. Synchronizowana lista (syncList): Jest to lista, której metody są synchronizowane za pomocą synchronized keyword, co oznacza, że w każdym momencie tylko jeden wątek może modyfikować listę.
  2. Współbieżna mapa (concurrentMap): Jest to specjalna struktura danych zaprojektowana do efektywnego działania w wielowątkowych środowiskach bez potrzeby blokowania całej struktury na czas modyfikacji.

Podsumowanie

Różnica między kolekcją synchronizowaną a współbieżną w Javie polega przede wszystkim na sposobie zarządzania dostępem do zasobów w środowisku wielowątkowym. Kolekcje synchronizowane są prostsze w implementacji, lecz mogą powodować znaczne spowolnienia ze względu na blokowanie dostępu do kolekcji podczas każdej operacji modyfikującej. Kolekcje współbieżne, takie jak ConcurrentHashMap, są złożone w implementacji, ale oferują lepszą skalowalność i wydajność, gdyż minimalizują potrzebę blokowania, umożliwiając tym samym wyższą przepustowość i lepszą obsługę współbieżnoś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