14
  1. Có thể một số giải thích an toàn khởi tạo an toàn khởi tạo theo yêu cầu của mô hình bộ nhớ Java?
  2. Làm cách nào để các trường cuối cùng giúp đạt được an toàn khởi tạo ?
  3. Vai trò của nhà xây dựng phát đảm bảo an toàn khởi tạo là gì?

Trả lời

21

An toàn khởi tạo cung cấp cho một đối tượng được nhìn thấy bởi một sợi bên ngoài trong trạng thái được khởi tạo đầy đủ (được khởi tạo). Điều kiện tiên quyết là đối tượng không được công bố sớm. trong hàm tạo của nó. Khi điều này được đảm bảo, JMM yêu cầu hành vi nhất định đối với các trường được khai báo là final. Thứ nhất, tất cả final lĩnh vực đối tượng được đảm bảo được nhìn thấy bởi một chủ đề bên ngoài trong trạng thái khởi tạo đầy đủ của nó - điều này không phải là tầm thường như âm thanh -

Hãy xem xét một lớp

class A{ 
    List list ; 
    A() { 
     list = Arrays.asList(some init expressions that adds 10 elements to list); 
    } 

} 

Một chủ đề mà truy cập vào list trong ví dụ của A không được bảo đảm mặc định để xem 10 phần tử trong danh sách đó. Trên thực tế, chuỗi này thậm chí có thể thấy listnull. Tuy nhiên, nếu list được khai báo là final, thì theo yêu cầu của JMM, thì list phải luôn xuất hiện để được khởi tạo với 10 phần tử.

Thứ hai, đảm bảo khởi tạo này không giới hạn ở trường final, nhưng được mở rộng đệ quy cho tất cả các đối tượng được nó nhắc đến. Ví dụ: nếu số list trong ví dụ trên là danh sách các số list, thì chuỗi bên ngoài được đảm bảo để xem các danh sách bên trong được khởi tạo hoàn toàn.

Lưu ý rằng không nơi nào chúng tôi đang sử dụng synchronized để đạt được sự an toàn này trong khả năng hiển thị bộ nhớ (xảy ra - trước mối quan hệ).

+1

+1 để đề cập rằng an toàn bắt đầu không chỉ đảm bảo an toàn cho các trường cuối cùng mà còn cho các đối tượng được tham chiếu bởi các trường cuối cùng. – Inquisitive

4

1. Khởi tạo an toàn cho phép xây dựng đúng đối tượng bất biến để được chia sẻ một cách an toàn trên chủ đề mà không sử dụng đồng bộ hóa, không phân biệt ngay cả khi họ xuất bản sử dụng một cuộc chạy đua dữ liệu.

2. Objects có lĩnh vực cuối cùng, khởi tạo an toàn ngăn chặn sắp xếp lại bất kỳ phần nào của xây dựng với tải ban đầu của một tham chiếu đến đối tượng đó.

+0

"không phân biệt ngay cả khi chúng được xuất bản bằng cách sử dụng cuộc đua dữ liệu". Dòng này không có ý nghĩa gì cả. Đối tượng không được xuất bản bằng cách sử dụng dữ liệu chủng tộc :-). – Inquisitive

+2

Tôi không chắc chắn về "ngăn chặn sắp xếp lại bất kỳ phần nào của xây dựng". Đảm bảo cho các lĩnh vực cuối cùng chỉ có hiệu lực cho việc khởi tạo các lĩnh vực cuối cùng, không phải các phần khác của xây dựng. – axtavt

+0

@axtavt thực sự sắp xếp lại được ngăn chặn bằng cách làm cho một trường dễ bay hơi không phải là cuối cùng. Vì vậy, điểm 2 là không chính xác theo tôi. – Inquisitive

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