java - 单例工厂方法

标签 java

是否可以在工厂方法中使用单例?我有很多域使用工厂方法。我该如何解决这个问题。请帮我举个例子。

最佳答案

在这个例子中,我相信你会想要同步你的 getInstance() 方法来确保两个线程不会同时进入它。否则,两个线程可能会在实例化单例的 block 内结束,这是非常有问题的。此解决方案的唯一问题是每次调用 getInstance() 时您都需要为方法的同步支付额外费用。 示例:

public static synchronized Singleton getInstance()
{
   // since whole method is synchronized only 1 thread can 
   // enter the following block ensuring only one instance 
   // is ever created. however we pay a synchronization
   // penalty every time this method is called.
   if(mInstance==null) { 
      mInstance=new Singleton();
   }
   return mInstance;
}

或者,您也可以切换到使用单例实例的急切初始化而不是惰性初始化,如果初始化很便宜,这可以保证并发性,并且不会为调用 getInstance() 方法支付同步惩罚。 示例:

// no synchronization penalty, but penalty for eager init
private static Singleton mInstance = new Singleton();                          

public static Singleton getInstance()
{
    return mInstance;
}

最优化的方法是使用双重检查锁定,由于 1.4 或更早的 JVM 中 volatile 关键字的不同实现,您需要 Java 1.5 或更新版本才能可靠地使用它(请参阅“Head First Design Patterns”第 5 章p.182 由 O'Reilly Media, Inc. 出版——这是我第一次读到它的地方。) 示例:

private volatile static Singleton mInstance;

private Singleton(){}

public static Singleton getInstance()
{
   if(mInstance==null) {
      synchronized (Singleton.class) { 
          // only pay synchronization penalty once
          if(mInstance==null){
              mInstance=new Singleton();
          }
      }
   }
   return mInstance;
}

关于java - 单例工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356004/

相关文章:

java - 使用 GenerationType.AUTO 未找到用于 h2 测试的序列 "HIBERNATE_SEQUENCE"

java - 让 Guava 在 GWT 上工作

java - Java Servlet 中的 session

java - MVC-将字符串从 servlet 传递到业务逻辑代码

java - 使用 hibernate 查询 : colon gets treated as parameter/escaping colon

java - 是否在 lambda 表达式中实例化了一个类?

java - 为什么我们必须使用精确的DataOutputStream来传输文本数据?

java - 如何使用 Java 确定 Google AppEngine 数据存储区中给定键的对象是否存在?

java - Maven Netbeans 打开的文件太多

java - 访问 android layout.xml 中的静态类字段