zoukankan      html  css  js  c++  java
  • NSLock 加锁

    iOS并发编程--8种加锁方式及比较

    1. @synchronized 关键字加锁
    2. NSLock 对象锁
    3. NSCondition
    4. NSConditionLock 条件锁
    5. NSRecursiveLock 递归锁
    6. pthread_mutex 互斥锁(C语言)
    7. dispatch_semaphore 信号量实现加锁(GCD)
    8. OSSpinLock

    这里分别使用8种方式加锁解锁1千万次,执行方法如下:

    #import 
    #import 
    
    - (void)runLock{
         CFTimeInterval timeBefore;
        CFTimeInterval timeCurrent;
        NSUInteger i;
        NSUInteger count = 1000*10000;//执行一千万次
    
        //@synchronized
        id obj = [[NSObject alloc]init];;
        timeBefore = CFAbsoluteTimeGetCurrent();
        for(i=0; i<count; :="" code="" condition="" conditionlock="" dispatch_semaphore="" dispatch_semaphore_t="" f="" i="0;" lock="" mutex="PTHREAD_MUTEX_INITIALIZER;" nscondition="" nsconditionlock="" nslock="" nsrecursivelock="" osspinlock="" osspinlocklock="" pthread_mutex="" pthread_mutex_t="" recursivelock="" semaphore="dispatch_semaphore_create(1);" spinlock="OS_SPINLOCK_INIT;" synchronized="" timebefore="CFAbsoluteTimeGetCurrent();" timecurrent="CFAbsoluteTimeGetCurrent();" used="">

    由此可以发现:OSSpinLock的性能最好,GCD的dispatch_semaphore紧随其后;
    NSConditionLock和@synchronized性能较差;

    PS:
    1. 需要注意的是这里仅仅是对各种锁直接Lock和Unlock的性能测试,其中部分锁的使用条件上还是有细微的差异的,比如NSLock之类的还有tryLock等方法用于加锁,不同对象锁的功能偏向不一样等等,有兴趣的可以逐个搜索再更深入的研究不同锁之间的区别。
    2. 另外,一般来说客户端很少会有这么大量的加锁解锁操作,所以日常来说这些锁的性能都是可以满足使用需求的。

  • 相关阅读:
    Delphi异常处理try except语句和try finally语句用法以及区别
    test
    Infopath resource
    C# IDE
    操作数据库
    不同版本数据库的导入
    workflow for sharepoint 2007
    http://www.cnblogs.com/BearStudyHard/archive/2008/03/26/1123267.html
    深入浅出InfoPath——安装VSTO
    如何使用Lotuscript管理Excel中的工作表?
  • 原文地址:https://www.cnblogs.com/zylin/p/5062858.html
Copyright © 2011-2022 走看看