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. 另外,一般来说客户端很少会有这么大量的加锁解锁操作,所以日常来说这些锁的性能都是可以满足使用需求的。

  • 相关阅读:
    LeetCode
    iOS开发系列--C语言之指针
    iOS开发系列--C语言之数组和字符串
    iOS开发系列--C语言之基础知识
    Entity Framework 5.0系列之数据操作
    Entity Framework 5.0系列之约定配置
    Entity Framework 5.0系列之自动生成Code First代码
    Entity Framework 5.0系列之Code First数据库迁移
    Entity Framework 5.0系列之EF概览
    Debian9安装vim和vim无法右键鼠标粘贴解决方法
  • 原文地址:https://www.cnblogs.com/zylin/p/5062858.html
Copyright © 2011-2022 走看看