牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

Double Checked Locking 模式

from:http://blog.csdn.net/wwsoon/archive/2007/01/17/1485886.aspx

之前在使用Double Check Locking 模式时,发现自己还是不太理解。于是写个记录,其实很简单,一看就明白了。

应用特别说明:
1.Double Check Locking模式是singleton的多线程版本,如果是单线程则应使用singleton。
2.Double Check Locking模式依就会使用锁——临界区锁定,不要以为可以避免使用锁。
3.Double Check Locking 解决的问题是:当多个线程存在访问临界区企图时,保证了临界区只需要访问一次。

下面是其适用特点:
1.多个线程试图并发访问一个临界区;
2.临界区只需执行一次;

分析如下3种方法:
//class singleton
//:s1-
singleton* get_instance(void)
{
    
lock();
    
if( instance == 0) {
       instance 
= new singleton;
    }
    unlock();
    
return instance;
}
**存在的问题是:无论是否已经初始化都要加锁,增加了负荷,已经没有所谓的并发性能了。

//:s-2
singleton* get_instance(void)
{
    
if( instance == 0){
        
lock();
        instance 
= new singleton;
        unlock();
    }
    
return instance;
}
**存在的问题是:不能保证临界区只初始化一次,没能实现singleton的基本功能;

//:s-3
singleton* get_instance(void)
{
    
if( instance == 0){
        
lock();
        
if( instance == 0 )
            instance 
= new singleton;
        unlock();
    }
    
return instance;
}
**解决上述问题——双检锁模式。

posted on 2007-10-11 13:21 杨粼波 阅读(160) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理