- 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?
- 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 ?
- 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
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 list
là null
. 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. 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 đó.
"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
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
@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
- 1. Vui lòng giải thích hàm băm không?
- 2. Vui lòng giải thích .NET Delegates
- 3. Vui lòng giải thích mã Mục tiêu-C này
- 4. Truy vấn SQL này làm gì? Vui lòng giải thích
- 5. System.Runtime.Remoting.Channels.CoreChannel.GetMachineIP() từ .NET Reflector - vui lòng giải thích
- 6. Bất thường con trỏ C, vui lòng giải thích
- 7. Vui lòng giải thích: trap 'sudo kill -9 - - $$' EXIT
- 8. Vui lòng giải thích cấu trúc thư mục cấu hình của Vim
- 9. Vui lòng giải thích về kết quả này của Symfony2 và ZendFramework 2
- 10. Bộ nhớ Java được giải thích (SUN JVM)
- 11. Mô hình bộ nhớ Java - ai đó có thể giải thích nó?
- 12. Nêu nhớ bộ nhớ json của Python
- 13. Mô hình bộ nhớ Java 7 giống như JSR-133?
- 14. Vui lòng giải thích vectơ hardcore này để đúc và đánh máy
- 15. Vui lòng định cấu hình SDK GWT?
- 16. Bạn vui lòng giải thích cho các giáo viên của OCaml không?
- 17. adobe air vs flex vs flash builder --- tôi cần giải thích xin vui lòng
- 18. ai đó có thể vui lòng giải thích cho tôi @MapsId trong chế độ ngủ đông?
- 19. Có thể ai đó vui lòng giải thích các truy vấn phương tiện CSS?
- 20. Giải thích xin vui lòng AngularJS $ injector với một ví dụ rõ ràng
- 21. Chức năng băm hoàn hảo và băm hoàn hảo động - giải thích xin vui lòng?
- 22. Vui lòng giải thích mã ví dụ cudaMemcpyToSymbol từ Hướng dẫn lập trình CUDA
- 23. Vui lòng giải thích hành vi kỳ lạ của .call (sai)
- 24. Có thể ai đó vui lòng giải thích cách startActivity (intent) và startActivityForResult (intent) là Không đồng bộ không?
- 25. C++ Bộ nhớ chưa được khởi tạo?
- 26. Các URL được chỉ định an toàn trong AWS S3 an toàn như thế nào?
- 27. Chủ đề có thể được tạo một cách an toàn trong khi khởi tạo tĩnh không?
- 28. Xóa mật khẩu an toàn trong bộ nhớ (Python)
- 29. Đồng bộ hóa mô hình bộ nhớ Java: cách tạo lỗi hiển thị dữ liệu?
- 30. Chủ đề khởi tạo lười biếng an toàn trên iOS
+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