2011-12-14 30 views
8

Phương thức ConcurrentHashMap.putAll (Map) có phải là nguyên tử không?Có phải "ConcurrentHashMap.putAll (...)" nguyên tử không?

Tôi không thể tìm thấy nó trong tài liệu và nó không được đề cập trong giao diện ConcurrentMap, vì vậy tôi đoán câu trả lời là không. Tôi yêu cầu nó chắc chắn, vì nó sẽ không có ý nghĩa nếu hoạt động đó không phải là nguyên tắc để trung thực.

Nếu nó không phải là nguyên tử, thì cách nào tốt nhất để hỗ trợ chèn nguyên tử của nhiều mục? Quay lại đồng bộ cũ tốt?

Trả lời

9

Nó không phải là nguyên tử, không. Theo the class documentation:

Đối với các hoạt động tổng hợp như putAllclear, khả năng tìm lại đồng thời có thể phản ánh chèn hay loại bỏ chỉ một số mục.

Để nguyên tử hóa, bạn sẽ phải sử dụng synchronized, có. Không có cách nào ngăn chặn việc này.

+0

Việc triển khai Bản đồ đồng thời khác (không chuẩn) là gì? –

+0

@pst Mà có thể là một ứng cử viên? –

+0

@JaperD. Tôi không có ý kiến. Chỉ cần tự hỏi nếu bạn có bất kỳ cái nhìn sâu sắc, mặc dù câu trả lời này vẫn còn hoàn thành mà không có. –

3

ở đầu the doc

Đối với các hoạt động tổng hợp như putAllclear, đồng thời năng tìm lại có thể phản ánh chèn hay loại bỏ chỉ một số mục.

2

putAll() không phải là nguyên tử mà chỉ bảo đảm mỗi cá nhân put() là nguyên tử.

2

Để atomicize nó, bạn sẽ phải sử dụng đồng bộ, có

Không chỉ có vậy: bạn cần phải đặt một khối đồng bộ xung quanh mọi phương pháp bản đồ công cộng do đó đồng thời giảm giá trị.

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