2012-11-01 10 views
8

Tôi đã xem qua các lưu ý sau đây trong java.lang.Class.newInstance0() trong JDK 1.7 Cập nhật 7:Tại sao java.lang.Class.newInstance0() không đúng theo mô hình bộ nhớ java?

Chú ý: đoạn mã sau có thể không nghiêm túc đúng theo mô hình bộ nhớ Java hiện nay.

Ai cũng có thể giải thích lý do tại sao?

+0

bạn có thể trích dẫn "mã sau" có liên quan không? – Vlad

+0

Tôi tìm thấy ghi chú (nhờ google) http://cr.openjdk.java.net/~jrose/7030453/webrev.00/raw_files/new/src/share/classes/java/lang/Class.java – Augusto

+0

loại DCL? http://www.javaworld.com/jw-02-2001/jw-0209-double.html – Flot2011

Trả lời

5

Vấn đề duy nhất trong mã này mà tôi có thể thấy là trường "cachedConstructor" dễ bay hơi, trong khi nó đảm bảo hiệu ứng hiển thị giá trị giữa các luồng, khối mã cụ thể này có một quirk mà các luồng khác nhau có thể thấy cachedConstructor là null trước giá trị sẽ được gán bởi một trong các luồng, tức là chuỗi khởi tạo không phải là nguyên tử. Điều này chỉ có thể dẫn đến bộ đệm ẩn có thể được chỉ định vài lần cùng một lúc, nhưng sẽ không phá vỡ mã nếu không ai đặc biệt dựa vào đó nó sẽ là cùng một cá thể Constructor. Nếu khối initialedConstructor initialisation sẽ được đồng bộ hóa, thì nó sẽ là nguyên tử, tức là cachedConstructor được gán chỉ một lần bất kể điều kiện chủng tộc.

Điều đó nói rằng, mã phải hoạt động đúng cách, nhưng chỉ cho phép đồng thời tính toán lại quá nhiều giá trị được lưu trong bộ nhớ cache của nhiều hơn một chuỗi.

+0

Sau đó, tôi đoán tác giả của nhận xét nên có một chút rõ ràng hơn trong ghi chú đó. Cảm ơn bạn đã làm rõ. – SpaceTrucker

1

dòng mô hình bộ nhớ Java

Câu hỏi đặt ra là "làm thế nào hiện tại".

Đoạn mã đó có thể rất cổ, từ 1,4 trở xuống và không ai chạm vào từ đó.

Tác giả có lẽ đã biết rằng một mô hình bộ nhớ mới đang được thực hiện.