Kiểm tra khóa kép. Bởi và lớn.
Mô hình mà tôi bắt đầu tìm hiểu các vấn đề khi tôi làm việc tại BEA, là mọi người sẽ kiểm tra một người độc thân theo cách sau:
public Class MySingleton {
private static MySingleton s_instance;
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) { s_instance = new MySingleton(); }
}
return s_instance;
}
}
Điều này không bao giờ hoạt động, bởi vì một luồng khác có thể đã được đưa vào khối được đồng bộ hóa và s_instance không còn null. Vì vậy, sự thay đổi tự nhiên là để thực hiện nó:
public static MySingleton getInstance() {
if(s_instance == null) {
synchronized(MySingleton.class) {
if(s_instance == null) s_instance = new MySingleton();
}
}
return s_instance;
}
Điều đó cũng không hoạt động, bởi vì Mô hình bộ nhớ Java không hỗ trợ nó. Bạn cần khai báo s_instance là không ổn định để làm cho nó hoạt động và thậm chí sau đó nó chỉ hoạt động trên Java 5.
Những người không quen thuộc với sự phức tạp của Mô hình bộ nhớ Java mọi lúc mọi nơi .