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

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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模式。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航