2014-09-09 17 views
6

Thuật ngữ ngữ cảnh an toàn trường cuối cùng được sử dụng thường xuyên trong đoạn 17.5.3 của JLS (sửa đổi sau cùng của trường cuối cùng). Mặc dù, như có thể được hiểu từ đặc điểm kỹ thuật (nếu tôi sai ở đây, xin vui lòng sửa tôi)Ý nghĩa chính xác của bối cảnh an toàn trường cuối cùng trong JLS

An implementation may provide a way to execute a block of code 
in a final-fieldsafe context. 

hành vi chính xác là phụ thuộc vào thực hiện, vẫn chưa có định nghĩa rõ ràng về thuật ngữ.
Tôi có thể giả sử, rằng nếu chúng ta có một trường chính thức đóng băng F (một xảy ra ở phần cuối của xây dựng đối tượng hoặc thức trường được thiết lập bởi các phương tiện phản ánh API) và một hành động Một, như vậy mà xảy ra trước (F, A), sau đó A có trong ngữ cảnh an toàn trường cuối cùng?

Trả lời

5

Để giúp hiểu những gì JLS 17.5.3 nghĩa bởi một 'chính thức trường bối cảnh an toàn', hãy xem xét đoạn mã sau

public static final AccountType SINGLETON_ACCOUNT_TYPE = new AwesomeAccountType(); 

Trước Java 5, Java đã có một 'tính năng' nơi an toàn thread của việc xây dựng các AwesomeAccountType và việc chuyển nhượng SINGLETON_ACCOUNT_TYPE đã được các nhà phát triển thực hiện để an toàn. Thật không may là spec đã mơ hồ và/hoặc không nói rõ hành vi, dẫn đến việc triển khai JVM khác nhau có các hành vi khác nhau. Kết quả là Java thường không phải là luồng an toàn và di động trong kịch bản này.

Lý do cho điều này là thứ tự của các hoạt động liên quan đến việc xây dựng AwesomeAccountType có thể được sắp xếp lại theo thời gian để tham chiếu đến đối tượng có thể hiển thị với một chuỗi khác trước khi đối tượng được xây dựng hoàn chỉnh. Hành vi này không xác định, nó luôn hoạt động trên các CPU đơn lõi và thường làm việc trên các CPU intel nhưng sẽ rơi nhanh hơn trên các CPU với một mô hình bộ nhớ yếu hơn như Alpha Dec.

'Bối cảnh an toàn trường cuối cùng' là vùng mã liên quan đến việc gán cho trường cuối cùng trên (SINGLETON_ACCOUNT_TYPE) và bao gồm tất cả hàm tạo cho AwesomeAccountType VÀ mã bên trong JVM cho cấp phát và khởi tạo bộ nhớ cho đối tượng.

Những thay đổi này đối với Mô hình bộ nhớ Java được thực hiện theo JSR133, Câu hỏi thường gặp sau rất hữu ích để hiểu bối cảnh của các thay đổi đã được thực hiện: JSR133 FAQ.

+0

Vì vậy, tôi đoán tất cả đều sai. Nhưng tôi vẫn cảm thấy bối rối. Trong liên kết đến JSR133 FAQ bạn đã đăng, họ đã đề cập đến "đối tượng được xây dựng chính xác". Tôi có thể suy đoán rằng đối tượng được xây dựng trong một bối cảnh an toàn trường cuối cùng, khi không con trỏ đến đối tượng này cũng không trỏ đến trường cuối cùng của nó bị rò rỉ trong khi xây dựng? Hay tôi lại sai à? – mkrakhin

+0

Hầu như, 'đối tượng được xây dựng chính xác' đề cập đến một vấn đề trong đó một ref cho đối tượng trốn sang mã khác trước khi đối tượng đã được xây dựng đầy đủ (hoặc có nguy cơ xảy ra). Google cho 'các vấn đề với khóa được kiểm tra kép trên Java'. Doug Lea đã viết một số bài báo tuyệt vời mà nghiên cứu kỹ những vấn đề này và hình thành cơ sở cho JSR 133. –

+0

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html là một ví dụ như vậy. Trang wikipedia về chủ đề cũng đáng đọc. http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java –

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