Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Sự khác biệt giữa Traditional Collections và Concurrent Collections trong Java

Trong Java, Collections Framework là một khái niệm cốt lõi khiến Java trở thành ngôn ngữ mạnh mẽ để xử lý dữ liệu. Collections hỗ trợ lưu trữ mọi kiểu dữ liệu thuận tiện, hiệu quả cùng các thao tác CRUD cơ bản.

Tuy nhiên, khi các collection truyền thống bị đưa vào môi trường đa luồng, hiệu năng bị giảm sút do thiếu hỗ trợ đồng thời. Để khắc phục hạn chế này, Java giới thiệu Concurrent Collections (từ JDK 1.5) - không chỉ giải quyết vấn đề đa luồng mà còn tối ưu hiệu năng khi nhiều luồng truy cập dữ liệu cùng lúc.

Bảng so sánh chi tiết

STT Tiêu chí Traditional Collections Concurrent Collections
1 An toàn luồng (Thread Safety) Đa số class kinh điển (ArrayList, LinkedList, HashMap...) không synchronized, không thread-safe. Cung cấp các class tương đương đã triển khai đồng bộ hóa nội bộ, thread-safe sẵn sàng dùng trong đa luồng.
2 Cơ chế khóa (Locking Mechanism) Có vài class synchronized cũ (Vector, Stack) nhưng dùng khóa toàn bộ collection (coarse-grained lock), làm giảm hiệu năng. Sử dụng khóa phân đoạn / khóa mảnh (fine-grained locking / striping) - chỉ khóa phần dữ liệu cần thiết, cho phép nhiều luồng truy cập đồng thời tốt hơn.
3 Ngoại lệ khi sửa đổi khi duyệt (ConcurrentModificationException) Nếu sửa đổi collection qua luồng khác trong khi đang duyệt (iterator) → ném ConcurrentModificationException (fail-fast). Không ném ngoại lệ này. Hỗ trợ weakly consistent iterators - cho phép sửa đổi khi duyệt, iterator phản ánh trạng thái hợp lý tại thời điểm tạo.
4 Ưu tiên sử dụng Không khuyến khích cho môi trường đa luồng. Ưu tiên hàng đầu cho môi trường đa luồng.
5 Thời điểm ra mắt Legacy collections, xuất hiện từ JDK 1.2 (Collections Framework). Ra mắt từ JDK 1.5 (package java.util.concurrent).

Ví dụ điển hình

Traditional (Không thread-safe) Concurrent (Thread-safe)
ArrayList CopyOnWriteArrayList
HashMap ConcurrentHashMap
HashSet ConcurrentHashMap.newKeySet() / CopyOnWriteArraySet
LinkedList (as Queue) ConcurrentLinkedQueue, ArrayBlockingQueue, LinkedBlockingQueue

Lưu ý quan trọng

  • Concurrent Collections không phải miễn dịch hoàn toàn mọi vấn đề đồng thời - logic nghiệp vụ phức tạp vẫn cần đồng bộ hóa thêm.
  • Iterator của Concurrent Collections là weakly consistent: không đảm bảo phản ánh mọi thay đổi real-time, nhưng không bao giờ ném ConcurrentModificationException.
  • Hiệu năng: ConcurrentHashMap vượt trội hơn Collections.synchronizedMap(new HashMap()) rất nhiều trong kịch bản đọc nhiều, ghi ít hoặc độ tranh chấp cao.