Java 比尔·普格';s实现单例的方法导致;不正常,请写“;?
我介绍了Bill Pugh在Java中实现单例设计模式的方法 我对此很担心。如果我哪里做错了,请纠正我Java 比尔·普格';s实现单例的方法导致;不正常,请写“;?,java,multithreading,design-patterns,singleton,Java,Multithreading,Design Patterns,Singleton,我介绍了Bill Pugh在Java中实现单例设计模式的方法 我对此很担心。如果我哪里做错了,请纠正我 请考虑下面Bill Pugh的代码: public class Singleton { // Private constructor prevents instantiation from other classes private Singleton() { } /** * SingletonHolder is loaded
请考虑下面Bill 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”第一次在第14行调用了“returnsingletonholder.INSTANCE;”。现在将在第10行实例化Singleton类
在这个实例化完成之前,让我们假设“Thread-1”被另一个线程“Thread-2”抢占。当第14行的“Thread-2”调用“return SingletonHolder.INSTANCE;”时
它会返回部分构造的对象吗
如果它返回一个部分构造的对象,这种情况将是“无序写入”。请让我知道,如果我对上述情况是正确的,并分享您的想法。
另外,请告诉我是否可以通过任何其他方式克服这种情况。实现Singleton的一种方法。实例将在加载类时创建
public class Singleton {
private Singleton() { }
public static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
}
它会返回部分构造的对象吗
答案是否定的。
当第一个线程调用这一行时,
SingletonHolder
类将由类加载器加载。现在,类SingletonHolder
中的静态变量以线程安全的方式初始化。因此,完全创建的单例
的引用将分配给实例
,只有这样控件才会返回调用线程。在此之前,所有其他线程将等待类加载过程完成。因此,不完整的创建对象将不会被返回。很好的解释。。谢谢:)+1对你在博客上读到的东西提出质疑。质疑每一件事是一个很好的做法。很乐意帮忙。
return SingletonHolder.INSTANCE;