当前位置:  开发笔记 > 编程语言 > 正文

Singleton Factory方法

如何解决《SingletonFactory方法》经验,为你挑选了1个好方法。

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



1> Chris B...:

在这个例子中,我相信你会想要同步你的getInstance()方法,以确保两个线程不同时输入它.否则,两个线程可以在实例化单例的块内部结束,这是非常有问题的.此解决方案的唯一问题是,每次调用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章第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;
}

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有