【问题标题】:Bill Pugh's method of implementing Singleton resulting in "Out-of-order Write"?Bill Pugh 实现 Singleton 的方法导致“乱序写入”?
【发布时间】:2013-09-10 08:59:09
【问题描述】:

我了解了 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 行,

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

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

【问题讨论】:

    标签: java multithreading design-patterns singleton


    【解决方案1】:

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

    答案是

    return SingletonHolder.INSTANCE;
    

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

    【讨论】:

    • 很好的解释.. 谢谢:)
    • +1 用于质疑您在博客上阅读的内容。质疑一切是一个好习惯。很高兴为您提供帮助。
    【解决方案2】:

    实现单例的一种方式。加载类时会创建实例

    public class Singleton {
                private Singleton() { }
                public static final Singleton INSTANCE = new Singleton();         
                public static Singleton getInstance() {
                        return INSTANCE;    
                }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多