Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比尔·普格';s实现单例的方法导致;不正常,请写“;?_Java_Multithreading_Design Patterns_Singleton - Fatal编程技术网

Java 比尔·普格';s实现单例的方法导致;不正常,请写“;?

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在Java中实现单例设计模式的方法

我对此很担心。如果我哪里做错了,请纠正我

请考虑下面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;