Phương thức forEach của ConcurrentHashMap có an toàn không? [bản sao]

Jan 05 2021

Nếu muốn lặp lại trên tất cả các phần tử trong ConcurrentHashMap, việc sử dụng forEachphương thức có an toàn cho luồng không?

Trả lời

1 JohnKugelman Jan 05 2021 at 11:08

Nó phụ thuộc vào những gì bạn có nghĩa là an toàn chủ đề.

  • Nếu bạn đồng ý với các chuỗi khác có thể sửa đổi bản đồ khi bạn đang thực hiện forEachcuộc gọi, thì có, đó là chuỗi an toàn.
  • Nếu bạn muốn bản đồ không thể sửa đổi trong khi forEachđang được xử lý để các luồng khác bị chặn hoặc xảy ra lỗi nếu họ cố gắng sửa đổi nó thì không, không phải vậy.

Các tài liệu API cho biết:

Tuy nhiên, ngay cả khi tất cả các hoạt động đều an toàn theo luồng, các hoạt động truy xuất không yêu cầu khóa và không có bất kỳ hỗ trợ nào cho việc khóa toàn bộ bảng theo cách ngăn chặn tất cả quyền truy cập.

...

Tương tự như vậy, các Trình lặp, Trình tách và Bảng liệt kê trả về các phần tử phản ánh trạng thái của bảng băm tại một thời điểm nào đó tại hoặc kể từ khi tạo trình lặp / liệt kê. Họ không ném ConcurrentModificationException.... Hãy nhớ rằng kết quả của các phương pháp trạng thái tổng hợp ... thường chỉ hữu ích khi một bản đồ không được cập nhật đồng thời trong các chuỗi khác. Mặt khác, kết quả của các phương pháp này phản ánh trạng thái nhất thời có thể thích hợp cho các mục đích giám sát hoặc ước tính, nhưng không phù hợp cho việc kiểm soát chương trình.