我介绍了Bill Pugh在Java中实现Singleton设计模式的方法。
我对此有关切。如果我在任何地方都错了,请纠正我。
请考虑以下比尔·皮尤的代码:
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"首次在第14行调用"return SingletonHolder.INSTANCE;"。现在,单例类将在第 10 行实例化。
在此实例化完成之前,假设"线程-1"被另一个线程 - "线程-2"抢占。当"Thread-2"在第 14 行调用"return SingletonHolder.INSTANCE;"时,
它会返回部分构造的对象吗?
如果它返回部分构造的对象,则这种情况将是"无序写入"。如果我在上述情况下是正确的,请告诉我并分享您的想法。另外,如果可以通过任何其他方式克服这种情况,请告诉我。
它会返回部分构造的对象吗?
答案是否定的。
return SingletonHolder.INSTANCE;
当第一个线程调用此行时,类加载器将加载SingletonHolder
类。现在类加载是线程安全的过程,然后以线程安全的方式初始化类SingletonHolder
中的静态变量。因此,完全创建的Singleton
的引用将被分配给INSTANCE
,然后控件才会返回到调用方线程。在此之前,所有其他线程将等待类加载过程完成。因此,不完整的创建对象将不会返回。
单例的一种方式。加载类时将创建实例
public class Singleton {
private Singleton() { }
public static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
}