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

原文地址:https://www.cnblogs.com/zylin/p/5062858.html