Tôi đã thực hiện một số nghiên cứu về người độc thân, đặc biệt liên quan đến việc khởi tạo lười biếng và háo hức của những người độc thân.Mẫu Singleton với sự kết hợp giữa tải trọng lười biếng và an toàn chủ đề
Một ví dụ về khởi háo hức:
public class Singleton
{
//initialzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
nhưng như trình bày ở trên rằng đó là háo hức khởi và an toàn thread trái sang JVM nhưng bây giờ, tôi muốn có cùng một khuôn mẫu này nhưng với khởi tạo lười biếng.
vì vậy tôi đưa ra cách tiếp cận này:
public final class Foo {
private static class FooLoader {
private static final Foo INSTANCE = new Foo();
}
private Foo() {
if (FooLoader.INSTANCE != null) {
throw new IllegalStateException("Already instantiated");
}
}
public static Foo getInstance() {
return FooLoader.INSTANCE;
}
}
Như đã trình bày ở trên Kể từ khi dòng
private static final Foo INSTANCE = new Foo();
chỉ được thực hiện khi FooLoader lớp được thực tế sử dụng, điều này sẽ chăm sóc của các instantiation lười biếng , và nó có được đảm bảo là luồng an toàn không.
Điều này có đúng không?
Duplicate http://stackoverflow.com/q/5842273/823393 – OldCurmudgeon
Đây thực sự không phải là khởi tạo lười biếng? Ví dụ có thể được nạp trước phương thức 'getInstance' được gọi. – Perception
Điều này chắc chắn là lười biếng. 'INSTANCE' chỉ được khởi tạo trên tham chiếu đầu tiên của lớp. Mà sẽ chỉ được tham chiếu trong lời gọi đầu tiên của 'getInstance'. Mặc dù tôi sẽ loại bỏ việc tạo kiểm tra trong constructor. –