比尔·皮尤(Bill Pugh)实现单例的方法导致"Out-of-order Write"?



我介绍了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;    
            }
    }

相关内容

  • 没有找到相关文章

最新更新