繁体   English   中英

Singleton Pattern和Synchronized有什么区别

[英]What is the difference between Singleton Pattern and Synchronized

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

我不确定是否应该通过实现单例模式来解决我的问题,或者将synchronized关键字添加到我的bean方法是否足够。

谁能解释到底有什么区别?

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方法中的初始化期间调用它。

我希望这可以帮助你。 对不起,我的英语不好,如果您需要更多信息,请发表评论。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM