Singleton Pattern和Synchronized之间有什么区别

时间:2016-01-20 09:15:31

标签: java design-patterns concurrency

我的一个Java EE Bean中的“线程安全”方法调用有关使用Lucene IndexWriter的问题。

我不确定是否应该通过实现 Singleton Pattern 来解决我的问题,或者是否足以将关键字synchronized添加到我的bean方法中。

有人可以解释一下究竟有什么区别吗?

2 个答案:

答案 0 :(得分:2)

Singleton只创建一个类的实例。只要它本身没有引用。

作为非线程安全方法的示例:

public class Singleton {

  private static Singleton instance;
  private Singleton () {}

  public static Singleton getInstance () {
    if (Singleton.instance == null) {
      Singleton.instance = new Singleton ();
    }
    return Singleton.instance;
  }
}

这个问题是:如果多个线程第一次同时执行getInstance,则会多次调用Singleton的构造函数。因此,单身人士不会是单身人士,后续的错误很难被发现。

线程安全方法的示例:

public class Singleton {

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

这个方法的坏处是,对于每次访问,调用getInstance方法(因此一个线程可以阻止其他方法)。

最后但并非最不重要的是同步版本:

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

类变量的初始化由类加载器隐式同步。通过使用内部类Singleton-Constructor,它只在getInstance方法中初始化内部类时调用。

我希望这会对你有所帮助。如果您需要更多信息,请发表评论,抱歉我的英语不好。

答案 1 :(得分:0)

单例模式是跨越jvm或应用程序实例的一个对象概念,而synchronized是java中用于互斥的关键字。请详细说明你的问题。