Bất cứ ai có thể cho tôi biết lớp học này có an toàn hay không?Đồng thời Java: là trường cuối cùng (khởi tạo trong hàm dựng) thread-safe?
class Foo {
private final Map<String,String> aMap;
public Foo() {
aMap = new HashMap<String, String>();
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
}
public String get(String key) {
return aMap.get(key);
}
}
Chỉnh sửa: Lỗi của tôi không làm rõ câu hỏi. Theo số JMM FAQ:
Cần đảm bảo đảm bảo an toàn khởi tạo mới. Nếu một đối tượng được xây dựng đúng (có nghĩa là các tham chiếu đến nó không thoát trong khi xây dựng), thì tất cả các luồng xem tham chiếu đến đối tượng đó cũng sẽ thấy các giá trị cho các trường cuối cùng được thiết lập trong hàm khởi tạo mà không cần đồng bộ hóa.
Điều này khiến tôi nhầm lẫn rằng tập hợp thành aMap là aMap = new HashMap<String, String>();
. Vì vậy, các chủ đề khác có thể xem các số này
aMap.put("1", "a");
aMap.put("2", "b");
aMap.put("3", "c");
hay không?
Edit: Tôi tìm thấy question này mà chính xác đóng cửa để câu hỏi của tôi
Đó là, nhưng sự hiện diện của từ khóa cuối cùng hoàn toàn không có gì để làm với điều đó, do đó, có vẻ như vẫn còn một số nhầm lẫn. Nếu bạn giải thích những gì bạn đang mong đợi đang xảy ra, chúng tôi có thể giúp đỡ nhiều hơn. – Affe
Ah-ha! Xem những gì bạn đang yêu cầu ngay bây giờ. Rõ ràng là tôi dành quá nhiều thời gian trong vùng đất của những hạt cà phê đơn thuần được quản lý. Có, nếu bạn đọc tất cả phần 17.5 của đặc tả ngôn ngữ java (bài viết mà bạn đã liên kết tóm tắt), nó đề cập rằng các đối tượng được tham chiếu bởi các trường cuối cùng cũng được đảm bảo cập nhật khi kết thúc xây dựng. – Affe