2

我经历了 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”已调用“return SingletonHolder.INSTANCE;” 第 14 行。现在 Singleton 类将在第 10 行实例化。

在这个实例化完成之前,让我们说“Thread-1”被另一个线程“Thread-2”抢占了。当“Thread-2”调用“return SingletonHolder.INSTANCE;” 在第 14 行,

它会返回部分构造的对象吗?

如果它返回一个部分构造的对象,这种情况将是“乱序写入”。请让我知道我在上述情况下是否正确并分享您的想法。另外请让我知道是否可以通过任何其他方式克服这种情况。

4

2 回答 2

3

它会返回部分构造的对象吗?

答案是否定的。

return SingletonHolder.INSTANCE;

当第一个线程将调用此行时,SingletonHolder类将由 ClassLoader 加载。现在类加载是线程安全的过程,类中的静态变量SingletonHolder然后以线程安全的方式初始化。所以完全创建的引用Singleton将被分配给INSTANCE,然后控制才会返回给调用者线程。在此之前,所有其他线程将等待类加载过程完成。因此不会返回不完整的创建对象。

于 2013-09-10T09:42:54.427 回答
0

实现单例的一种方法。加载类时将创建实例

public class Singleton {
            private Singleton() { }
            public static final Singleton INSTANCE = new Singleton();         
            public static Singleton getInstance() {
                    return INSTANCE;    
            }
    }
于 2013-09-10T09:09:38.553 回答