需要 Java Singleton 解释

标签 java thread-safety singleton

通常我使用第一个实现。几天前我发现了另一个。 任何人都可以向我解释这两种实现之间的区别吗? 第二种实现是线程安全的吗? 在第二个例子中使用内部类有什么好处?

//--1st Impl
public class Singleton{

      private static Singleton _INSTANCE;

      private Singleton() {}
      public static Singleton getInstance(){
          if(_INSTANCE == null){
               synchronized(Singleton.class){
                      if(_INSTANCE == null){
                          _INSTANCE = new Singleton();
                      }
               }
          }
      return _INSTANCE;
      }  
}

//--2nd Impl
public class Singleton {
      private Singleton() {}

      private static class SingletonHolder { 
            private static final Singleton _INSTANCE = new Singleton();
      }

      public static Singleton getInstance() {
            return SingletonHolder._INSTANCE;
      }
}

最佳答案

第一个实现使用所谓的“双重检查锁”。这是一件非常糟糕的事情。它看起来是线程安全的,但实际上并非如此。

第二种实现确实是线程安全的。

关于为什么第一个实现被破坏的解释相当复杂,所以我建议您获取 Brian Goetz 的 Java Concurrency in Practice 的副本。详细解释。简短的版本是允许编译器在构造函数完成之前分配 _INSTANCE 变量,这可能导致第二个线程看到部分构造的对象。

关于需要 Java Singleton 解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656331/

相关文章:

java - Spring MVC 与 Soap 服务多线程和多服务器

java - 证明以下代码不是线程安全的

java - 如何用策略实现单例?

java - 我可以并且是否需要避免单例模式?

java - Apache CXF 是否支持 TLS 1.2?

java - 在 Spring 中将属性文件中的所有键和值作为 Map 注入(inject)

java - 如何过滤 Google Play,使应用仅显示在 7 英寸平板电脑上

c++ - Qt线程同步设计

java - Guice 单例是否支持线程限制?

java - Android:变量在while循环中的值不正确