6

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

11

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ử.

+5

+1 Và cả hai hoạt động đều là nguyên tử. –

+0

Tôi nên đọc kỹ Javadoc ... Cảm ơn! –

2

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.

0

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.

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