软件工程

本类阅读TOP10

·PHP4 + MYSQL + APACHE 在 WIN 系统下的安装、配置
·Linux 入门常用命令(1)
·Linux 入门常用命令(2)
·使用 DCPROMO/FORCEREMOVAL 命令强制将 Active Directory 域控制器降级
·DirectShow学习(八): CBaseRender类及相应Pin类的源代码分析
·基于ICE方式SIP信令穿透Symmetric NAT技术研究
·Windows 2003网络负载均衡的实现
·一网打尽Win十四种系统故障解决方法
·数百种 Windows 软件的免费替代品列表
·收藏---行百里半九十

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
singleton模式的一种变体:double-checked locking

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

singleton模式的一种变体:double-checked locking

在单线程下,我们的singleton多半是这样(java):
class Singleton{
  private Singleton(){ //... };
  private static Singleton instance = null;
  public static Singleton getInstance
  {
    if ( instance == null )
      instance = new Singleton();
    return instance;
  };
  //...
  }

但是在多线程环境下,这里有个问题:如果一个线程先检查了instance==null,然后开始创建新的实例;同时另一个线程又来检查instance==null(此时第一个线程的创建还没完成),然后也创建新的实例。这样就有了Singleton类的两个实例——我们的singleton模式失败了。

所以我们应该加入同步代码。但是加在哪里呢?如果每个线程都需要同步再获得实例引用,这必然会形成一个瓶颈;如果在instance==null的检查后面加同步代码……这根本没有用。为什么?自己想想吧。

我们应该怎么办?同步代码肯定应该在instance==null的后面,同时,在创建新对象之前应该再检查一次instance==null:
class Singleton{
  //...
  private synchronized static void doSync(){
    //在这里同步
  }
  public Singleton getInstance(){
    if(instance==null){
      Singleton.doSync();
      if(instance==null)  // 再进行一次检查
        instance = new Singleton();
    }
    return instance;
  }

两次检查,既避免了效率瓶颈,又避免了重复创建。这就是double-checked locking模式。


相关文章

相关软件