注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ksnowlv的博客

积土成丘,集腋成裘,坚持再坚持!

 
 
 

日志

 
 

双重检查锁定模式(DCLP)  

2014-01-16 21:18:32|  分类: 设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
         双重检查锁定模式(也被称为"双重检查加锁优化","锁暗示"(Lock hint)[1]) 是一种软件设计模式用来减少并发系统中竞争和同步的开销。双重检查锁定模式首先验证锁定条件(第一次检查),只有通过锁定条件验证才真正的进行加锁逻辑并再次验证条件(第二次检查)。请看下IPHONE版本下的实现(MRC)

//

//  QMyBaseClass.h

//  DCLPTest

//

//  Created by lv wei on 14-1-16.

//  Copyright (c) 2014 lv wei. All rights reserved.

//


#import <Foundation/Foundation.h>


@interface QMyBaseClass : NSObject


+ (QMyBaseClass *)sharedMyBaseClass;


@end


//

//  QMyBaseClass.m

//  DCLPTest

//

//  Created by lv wei on 14-1-16.

//  Copyright (c) 2014 lv wei. All rights reserved.

//


#import "QMyBaseClass.h"


static QMyBaseClass* _sharedQMyBaseClass = nil;




@implementation QMyBaseClass


+ (QMyBaseClass *)sharedMyBaseClass

{

    if (_sharedQMyBaseClass == nil) {

        

        @synchronized(self)

        {

            if (nil == _sharedQMyBaseClass) {

                _sharedQMyBaseClass = [[QMyBaseClass alloc] init];

            }

        }

    }

    

    return _sharedQMyBaseClass;

}


@end


为什么判断两次?


   外面的检查是本来要进行的检查。里面为什么要检查呢,如果两个线程都判断到_sharedQMyBaseClassnil,都进入了外面的if,那么他们将执行两次创建,可能会创建出两个对象,造成内存泄漏等问题。 

   那为什么不直接使用以下CODE呢?

        @synchronized(self)

        {

            if (nil == _sharedQMyBaseClass) {

                _sharedQMyBaseClass = [[QMyBaseClass allocinit];

            }

        }

   其实也是可以的,但是由于同步降低了性能,于是才有了这样的策略,即只在第一次创建的时候才保证同步,而绝大部分时候是不会进入synchronized块的。

   这就是DCLP的优点:用来减少并发系统中竞争和同步的开销

  评论这张
 
阅读(138)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018