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

Sự khác biệt giữa HashMap và ConcurrentHashMap

Như chúng ta biết, trong Java Collections Framework là một trong những cấu trúc dữ liệu quan trọng nhất để lưu trữ dữ liệu. Trong Collections có nhiều triển khai như Map, Set, List, v.v., khiến việc lưu trữ và thao tác dữ liệu trở nên hiệu quả, đặc biệt là trong môi trường đa luồng.

Trong số các triển khai của Collections, HashMap là một collection quan trọng lưu trữ dữ liệu theo cặp Key-Value. Về mặt đa luồng, có thêm triển khai gọi là Concurrent Collections - cụ thể là ConcurrentHashMap - mà bên cạnh các đặc tính của HashMap còn cho phép xử lý dữ liệu an toàn trong môi trường đa luồng.

Dựa trên triển khai nội bộ của cả hai collection, dưới đây là những khác biệt quan trọng:

STT Tiêu chí HashMap ConcurrentHashMap
1 Đa luồng (Concurrency) Không an toàn cho luồng (non thread-safe). Nhiều luồng truy cập cùng lúc có thể gây lỗi dữ liệu. An toàn cho luồng (thread-safe). Phù hợp cho môi trường đa luồng.
2 Triển khai nội bộ Không có khái niệm segment. Lưu trữ dữ liệu trong mảng bucket đơn giản. Chia thành nhiều segment (mặc định 16) khi khởi tạo. Mỗi luồng có thể làm việc trên một segment riêng biệt, cho phép truy cập đồng thời cao.
3 Phiên bản giới thiệu JDK 1.2 JDK 1.5 (bởi Sun Microsystems)
4 Cho phép null Cho phép null cho cả key và value. Không cho phép null cho key hay value. Sẽ ném NullPointerException nếu cố gắng thêm.
5 Cơ chế đồng bộ Không có đồng bộ hóa. Nếu cần, có thể wrap bằng Collections.synchronizedMap() nhưng sẽ khóa toàn bộ map. Đạt thread-safety bằng cách chia map thành các partition dựa trên concurrency level, chỉ khóa phần tử cần thiết thay vì toàn bộ map.
6 Hiệu năng Khi đồng bộ hóa bằng Collections.synchronizedMap(), hiệu năng giảm do khóa toàn bộ map cho mọi thao tác ghi. Hiệu năng tốt hơn trong môi trường đồng thời cao nhờ cơ chế khóa phân đoạn (segment locking / CAS từ Java 8+), cho phép nhiều luồng đọc/ghi cùng lúc.

Tóm tắt khi nào dùng nào?

  • HashMap: Ứng dụng đơn luồng, hoặc khi đã có cơ chế đồng bộ hóa bên ngoài, cần hiệu năng tối đa và cho phép null key/value.
  • ConcurrentHashMap: Ứng dụng đa luồng, cần hiệu năng cao khi đọc/ghi đồng thời, không cần null key/value.