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. NSFetchedResultsController v.s. UILocalizedIndexedCollation
- 2. C# delegate v.s. eventHandler
- 3. nút html v.s. gửi html?
- 4. Thử nghiệm hiệu suất: sem_t v.s. dispatch_semaphore_t và pthread_once_t v.s. dispatch_once_t
- 5. CodeSmith v.s. T4: .netTiers level suite
- 6. Thời gian tuyến tính v.s. Số lần hai lần
- 7. Sự khác nhau giữa Index v.s. Khóa trong MySQL
- 8. GPS V.S. gia tốc để tính khoảng cách
- 9. cố gắng hiểu khái niệm mysql: phiên v.s. kết nối
- 10. Đối số vị trí v.s. từ khóa luận
- 11. ConcurrentHashMap.get() có được đảm bảo để xem một ConcurrentHashMap.put() trước đó bằng các luồng khác nhau không?
- 12. thư viện tĩnh v.s. nhập thư viện trên nền tảng Windows
- 13. Quản trị Django sử dụng API RESTful v.s. Cơ sở dữ liệu
- 14. Javascript: setAttribute() v.s. element.attribute = giá trị để thiết lập "tên" thuộc tính
- 15. Trộn V.S. offscreen-rendering, cái nào tệ hơn cho hiệu năng Core Animation?
- 16. ThreadStatic v.s. ThreadLocal <T>: tốt hơn so với thuộc tính?
- 17. Chuỗi tài liệu Python: Trích dẫn ba lần v.s. Double quote
- 18. phát minh lại các bánh xe: Node.JS/Lập trình hướng sự kiện v.s. Lập trình chức năng?
- 19. Phân biệt giữa iPhone đen và trắng?
- 20. kích thước bộ nhớ của cấu trúc dữ liệu Python
- 21. Tắt bàn phím <enter> phím
- 22. Whats sự khác biệt giữa HttpRuntime.Cache và Session?
- 23. máy chủ trò chuyện với WebSocket + Node.js vs một khách hàng bản địa với XMPP
+1 Và cả hai hoạt động đều là nguyên tử. –
Tôi nên đọc kỹ Javadoc ... Cảm ơn! –