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:
- 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ę. - 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.