我通过Bull-Pugh的方法在Java中实现Singleton设计模式。
我对此感到担忧。如果我在任何地方都错了,请纠正我。
请考虑以下Bull-Pugh代码:
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() { }
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
public static final Singleton INSTANCE = new Singleton(); // Line 10
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE; // Line 14
}
}
考虑“Thread-1”调用“return SingletonHolder.INSTANCE;”在线14上第一次。现在Singleton类将在Line-10上实例化。
在此实例化完成之前,让我们说“Thread-1”被另一个线程 - “Thread-2”抢占。当“Thread-2”调用“return SingletonHolder.INSTANCE;”时在第14行,
它会返回部分构造的Object吗?
如果它返回部分构造的对象,则这种情况将是“无序写入”。如果我对上述案例不正确,请告诉我并分享您的想法。 如果可以通过任何其他方式克服这种情况,请告诉我。提前谢谢。
答案 0 :(得分:2)
它会返回部分构造的Object吗?
return SingletonHolder.INSTANCE;
当第一个线程调用此行时,ClassLoader将加载SingletonHolder
类。现在classloading is thread-safe process,然后以线程安全的方式初始化类SingletonHolder
中的静态变量。因此,完全创建的Singleton
的引用将被分配给INSTANCE
,然后控件将返回到调用者线程。在此之前,所有其他线程都将等待类加载过程完成。因此,不会返回不完整的创建对象。
答案 1 :(得分:0)
实现Singleton的一种方法。加载类
时将创建实例public class Singleton {
private Singleton() { }
public static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
}