Từ Javadoc tôi biết ConcurrentHashMap.replace
là nguyên tử, nhưng còn khoảng ConcurrentHashMap.put
thì sao? Tôi thấy chúng được thực hiện khác nhau trong mã nguồn nhưng tôi không thể tìm ra sự khác biệt của chúng. Có rất nhiều chuyên gia để đưa ra một số hướng dẫn về cách sử dụng hai phương pháp này không?ConcurrentHashMap.put V.S. ConcurrentHashMap.replace
Trả lời
Chúng có chức năng khác nhau. replace
chỉ lưu trữ cặp khóa-giá trị nếu đã có giá trị được lưu trữ trong khóa được chỉ định. Tài liệu API của replace
giải thích:
Thay thế mục nhập cho khóa chỉ khi hiện được ánh xạ tới một số giá trị. Điều này tương đương với
if (map.containsKey(key)) { return map.put(key, value); } else return null;
ngoại trừ hành động được thực hiện nguyên tử.
put()
được kế thừa từ lớp AbstractMap
trong đó ConcurrentHashMap
mở rộng. Không có hợp đồng đồng thời cụ thể nào trên put()
. Thừa kế này cho phép sử dụng ConcurrentHashMap
trong ngữ cảnh "truyền thống" của Bản đồ. Nhưng không có phương pháp AbstractMap
là nguyên tử.
replace()
được triển khai theo yêu cầu của giao diện ConcurrentMap
. Giao diện này yêu cầu các hoạt động nguyên tử như replace()
. Chỉ có các phương thức của giao diện này được sử dụng trong một mã nhận biết đồng thời.
Để có hoạt động put()
nguyên tử, hãy sử dụng putIfAbsent()
đến từ cùng giao diện ConcurrentMap
này.
Nhìn vào mã của PUT trong ConcurrentHashMap, việc thực hiện có hành vi nguyên tử được thêm vào nó, và Java tài liệu nói:
Blockquote Lớp này tuân theo các đặc tả chức năng tương tự như Hashtable, và bao gồm các phiên bản của phương pháp tương ứng với từng phương pháp của Hashtable.
Theo tôi hiểu, nên an toàn khi sử dụng phương thức đặt trong ConcurrentHashMap.
+1 Và cả hai hoạt động đều là nguyên tử. –
Tôi nên đọc kỹ Javadoc ... Cảm ơn! –