5

Tôi cần một HashMap có thể truy cập từ nhiều luồng.Có bất kỳ hạn chế nào với ConcurrentHashMap không?

Có hai tùy chọn đơn giản, sử dụng HashMap bình thường và đồng bộ hóa trên đó hoặc sử dụng ConcurrentHashMap.

Vì ConcurrentHashMap không chặn hoạt động đọc, có vẻ như nó phù hợp hơn cho nhu cầu của tôi (hầu như chỉ đọc, gần như không bao giờ cập nhật). Mặt khác, tôi mong đợi đồng thời rất thấp, vì vậy không nên chặn (chỉ là chi phí quản lý khóa).

Bản đồ cũng sẽ rất nhỏ (dưới mười mục nhập), nếu điều đó tạo ra sự khác biệt.

So với HashMap thông thường, hoạt động đọc và ghi tốn kém hơn bao nhiêu (tôi cho rằng chúng là)? Hoặc là ConcurrentHashMap luôn luôn tốt hơn khi có thể thậm chí là một mức độ vừa phải truy cập đồng thời, bất kể tỷ lệ đọc/cập nhật và kích thước?

+0

câu hỏi trùng lặp chính xác? http://stackoverflow.com/questions/1378310/performance-concurrenthashmap-vs-hashmap – andersoj

+0

Thật vậy. Cảm ơn.(Không có câu trả lời thỏa đáng ở đó, mặc dù) – Thilo

Trả lời

6

Mặt khác, tôi mong đợi đồng thời rất thấp, vì vậy không nên chặn (chỉ chi phí quản lý khóa).

Chi phí mua và phát hành bỏ cấm Java mutex (khóa nguyên thủy) là rất nhỏ. Vì vậy, nếu bạn tin rằng xác suất tranh chấp là rất thấp thì một đơn giản HashMap có lẽ là đặt cược tốt nhất của bạn.

Nhưng đây là tất cả phỏng đoán. Trừ khi và cho đến khi bạn đã thực sự lược tả ứng dụng của bạn, tất cả thời gian dành cho tối ưu hóa đầu cơ là rất có thể (*) lãng phí thời gian.

* ... trừ khi bạn có thực sự trực giác tốt.

+0

Stephen C là đúng (đại diện của ông cho thấy đây là một thói quen). Khóa không được kiểm soát là nhanh chóng trong trường hợp chung ... Tôi cuối cùng đạt đến CHM quá nhanh, có lẽ. – andersoj

+0

Điều gì về mở rộng quy mô? Whats mong đợi và những gì có thể xảy ra là hoàn toàn khác nhau. Nếu khóa/mở khóa quá nhỏ, chỉ cần sử dụng 'ConcurrentHashMap' và di chuyển trên – TheLQ

+1

@TheLQ - đó là các chi phí khác (ngoài việc khóa) sử dụng ConcurrentHashMap là mối quan tâm. Bạn không chỉ ném CCM vào một vấn đề với giả định rằng khả năng mở rộng * sẽ * là một vấn đề. Bạn đo đầu tiên! –

2

CHM thanh toán một số hình phạt cho việc sử dụng các hoạt động Atomic * bên dưới bìa, khi so sánh với HashMap. Bao nhiêu? Đoán những gì ... đo lường nó trong ứng dụng của bạn ... ;-)

Nếu bạn thấy rằng bạn thực sự có vấn đề về hiệu suất, có lẽ giải pháp rất chuyên biệt cho các mục nhập < 10 sẽ rẻ hơn bất kỳ giải pháp nào được lắp ráp của java.util đất, nhưng tôi sẽ không chuyển sang điều đó cho đến khi bạn biết mình có vấn đề về hiệu suất.

+0

Câu hỏi tôi có là nếu tôi nên chuyển sang sử dụng ConcurrentHashMap trước khi tôi biết rằng tôi có một vấn đề hiệu suất. Tôi sẽ không muốn làm điều đó nếu CHM thực sự chậm hơn HashMap trong trường hợp không có đồng thời. – Thilo

+0

Tôi đoán tôi sẽ sử dụng 'CHM' nếu nó ngay lập tức rõ ràng rằng bạn có thể có được điều khiển đồng thời bạn muốn w /' putIfAbsent() 'và tương tự; Tôi muốn sử dụng 'sync (normalHashMap)' nếu bạn biết trước rằng hoạt động 'put()' sẽ phức tạp. (Tối ưu hóa một trong hai sau nếu đó là một vấn đề ...) – andersoj

2

Về mặt thông lượng và hiệu suất, chi phí thường không đáng kể.

Trên ghi chú khác, dấu chân bộ nhớ của ConcurrentHashMap (ở cấp độ thể hiện) có phần lớn hơn một HashMap. Nếu bạn có một số lượng lớn CHM nhỏ, chi phí này có thể tăng lên.

Các vấn đề liên quan