Điều này nói rằng việc gán trường luôn luôn là nguyên tử ngoại trừ các trường dài hoặc gấp đôi.Tại sao khóa kiểm tra kép bị hỏng trong Java?
Tuy nhiên, khi tôi đọc một Giải thích về việc tại sao hai séc khóa bị hỏng, nó nói rằng vấn đề là trong hoạt động chuyển nhượng:
// Broken multithreaded version
// "Double-Checked Locking" idiom
class Foo {
private Helper helper = null;
public Helper getHelper() {
if (helper == null) {
synchronized(this) {
if (helper == null) {
helper = new Helper();
}
}
}
return helper;
}
// other functions and members...
}
- thông báo Chủ đề Một rằng giá trị không được khởi tạo , do đó, nó có được khóa và bắt đầu khởi tạo giá trị .
- Do ngữ nghĩa của một số ngôn ngữ lập trình, mã tạo ra bởi trình biên dịch được phép để cập nhật các biến dùng chung để chỉ đến một đối tượng xây dựng một phần trước khi A đã hoàn thành thực hiện khởi tạo.
- Chủ đề B thông báo rằng biến chia sẻ đã được khởi tạo (hoặc là nó xuất hiện) và trả về giá trị của nó. Bởi vì chủ đề B tin rằng giá trị là đã được khởi tạo, nó không có được khóa. Nếu B sử dụng đối tượng trước khi tất cả quá trình khởi tạo được thực hiện bởi B (hoặc bởi vì A chưa hoàn thành khởi tạo hoặc vì một số giá trị được khởi tạo trong đối tượng chưa được vi phạm vào bộ nhớ B sử dụng (bộ nhớ cache kết hợp)), chương trình có thể sẽ bị lỗi .
(từ http://en.wikipedia.org/wiki/Double-checked_locking).
Khi nào có thể? Có thể là trên hoạt động gán JVM 64 bit không phải là nguyên tử? Nếu không thì liệu "khóa kiểm tra kép" có bị hỏng không?
Không có sự khác biệt trên JVM 64 bit. – rapadura
có thể trùng lặp của http://stackoverflow.com/questions/12448864/java-double-locking-can-someone-explain-more-simply-why-intuition-wouldnt-wor/12449110?noredirect=1#comment26446551_12449110 –