2012-09-28 32 views
41

Sự khác biệt giữa ConcurrentHashMap và Hashtable trong Java là gì?ConcurrentHashMap và Hashtable trong Java

Ứng dụng nào hiệu quả hơn cho các ứng dụng được tạo luồng?

+0

Có thể điều này sẽ giúp http://www.codercorp.com/blog/java/why-concurrenthashmap-is-better-than-hashtable-and-just-as-good-hashmap.html – kosa

+2

Đối với một người không phải là luồng ứng dụng, sử dụng 'HashMap'. –

+0

Ngoài ra, hãy xem http://stackoverflow.com/a/40878/632951 để biết thêm thông tin. – Pacerier

Trả lời

68

ConcurrentHashMap sử dụng nhiều nhóm để lưu trữ dữ liệu. Điều này tránh đọc khóa và cải thiện đáng kể hiệu suất trên HashTable. Cả hai đều là chủ đề an toàn, nhưng có hiệu suất rõ ràng thắng với ConcurrentHashMap.

Khi bạn đọc từ ConcurrentHashMap sử dụng get(), không có khóa, trái với HashTable mà tất cả các thao tác đều được đồng bộ hóa đơn giản. HashTable được phát hành trong phiên bản cũ của Java trong khi ConcurrentHashMap là một điều 5+ java.

HashMap là cách tốt nhất để sử dụng trong một ứng dụng đơn luồng.

+10

Ngoài ra còn có 'ConcurrentHashMap.putIfAbsent()' không có giá trị tương đương trong phiên bản cũ ' Hashtable'. Và khi bạn chỉ đọc từ một 'ConcurrentHashMap', không có khóa, trái với' Hashtable' mà tất cả các hoạt động được đồng bộ hóa đơn giản. –

+0

@FrankPavageau đã thêm nhận xét rất hữu ích của bạn vào câu trả lời Gốc. – Algorithmist

53

ConcurrentHashMap và cơ chế khóa Hashtable

  • Hashtable là thuộc khuôn khổ Bộ sưu tập; ConcurrentHashMap thuộc về khuôn khổ Executor.
  • Hashtable sử dụng khóa đơn cho toàn bộ dữ liệu. ConcurrentHashMap sử dụng nhiều khóa trên cấp phân đoạn (16 theo mặc định) thay vì cấp đối tượng tức là toàn bộ Map.
  • ConcurrentHashMap khóa chỉ được áp dụng cho các bản cập nhật. Trong trường hợp retrievals, nó cho phép đồng thời đầy đủ, retrievals phản ánh kết quả của các hoạt động cập nhật gần đây hoàn thành. Vì vậy, đọc có thể xảy ra rất nhanh trong khi viết được thực hiện với một khóa.
  • ConcurrentHashMap không ném ConcurrentModificationException nếu một chủ đề cố sửa đổi trong khi một chuỗi đang lặp qua nó và không cho phép giá trị null.
  • ConcurrentHashMap trả về Iterator, không an toàn (tức là trình lặp sẽ tạo bản sao của cấu trúc dữ liệu nội bộ) về sửa đổi đồng thời.
  • ConcurrentHashMap sử dụng một logic mảnh cơ sở dữ liệu (Segment<K, V>[] segments) được biết đến như Concurrency cấp, tức là chia dữ liệu thành những mảnh (đoạn) hơn đặt ổ khóa trên mỗi phân đoạn (segment) thay vì đặt một khóa duy nhất cho toàn bộ dữ liệu (Map). Giá trị mặc định là 16.

Để hiểu được ConcurrentHashMap kỹ thuật chi tiết xin xem xét điều này link

Sự giống nhau sau đây sẽ giúp bạn có được hiểu khái niệm chỉ (không lôgic)

  • Giả HashtableConcurrentHashMap là hai loại Nhà.
  • Hashtable khóa cửa chính của ngôi nhà.
  • ConcurrentHashMap khóa cửa phòng cụ thể thay vì cửa chính.

Ứng dụng nào hiệu quả hơn cho các ứng dụng luồng?

ConcurrentHashMap hiệu quả hơn cho các ứng dụng được tạo chuỗi.

+0

Câu trả lời hay + Peter – prayagupd

+0

Rất được giải thích rõ ràng – RamBen

+2

Ví dụ về nhà giành được tất cả lý thuyết :) –