Khi tôi đọc bài viết Wikipedia về Double Checked Locking thành ngữ, tôi là nhầm lẫn về nó thực hiện:Tại sao khóa kiểm tra kép này được triển khai với lớp trình bao bọc riêng biệt?
public class FinalWrapper<T> {
public final T value;
public FinalWrapper(T value) {
this.value = value;
}
}
public class Foo {
private FinalWrapper<Helper> helperWrapper = null;
public Helper getHelper() {
FinalWrapper<Helper> wrapper = helperWrapper;
if (wrapper == null) {
synchronized(this) {
if (helperWrapper == null) {
helperWrapper = new FinalWrapper<Helper>(new Helper());
}
wrapper = helperWrapper;
}
}
return wrapper.value;
}
}
Tôi chỉ đơn giản là không hiểu tại sao chúng ta cần tạo wrapper. Không đủ sao?
if (helperWrapper == null) {
synchronized(this) {
if (helperWrapper == null) {
helperWrapper = new FinalWrapper<Helper>(new Helper());
}
}
}
Có phải vì việc sử dụng trình bao bọc có thể tăng tốc khởi tạo vì trình bao bọc được lưu trữ trên ngăn xếp và helperWrapper được lưu trữ trong heap?
@pst: Tôi nghĩ anh ấy đang hỏi về biến địa phương 'wrapper' bổ sung chứa một bản sao của' helperWrapper'. – casablanca
@casablanca Oh, hum, bỏ lỡ góc đó hoàn toàn .... bây giờ tôi đang bối rối, do phần còn lại của từ ngữ của câu hỏi. "Tôi không hiểu tại sao chúng ta cần phải tạo ra một wrapper." :( –
Câu hỏi hay bằng cách này Chào mừng bạn đến với SO! – Voo