iOS开发中常用的锁有如下几种

来比较一下遇到加锁的情况:

1. @synchronized 关键字加锁

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

8. OSSpinLock (暂不建议使用,原因参见这里)

//分别使用8种方式加锁 解锁1千万次

- (void)runLock{

CFTimeInterval timeBefore;

CFTimeInterval timeCurrent;

NSUInteger i;

NSUInteger count = 1000*10000;//执行一千万次

//@synchronized

id obj = [[NSObjectalloc]init];;

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

@synchronized(obj){

}

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("@synchronized used : %f\n", timeCurrent-timeBefore);

//NSLock

NSLock *lock = [[NSLockalloc]init];

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

[lock lock];

[lock unlock];

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("NSLock used : %f\n", timeCurrent-timeBefore);

//NSCondition

NSCondition *condition = [[NSConditionalloc]init];

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

[condition lock];

[condition unlock];

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("NSCondition used : %f\n", timeCurrent-timeBefore);

//NSConditionLock

NSConditionLock *conditionLock = [[NSConditionLockalloc]init];

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

[conditionLock lock];

[conditionLock unlock];

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("NSConditionLock used : %f\n", timeCurrent-timeBefore);

//NSRecursiveLock

NSRecursiveLock *recursiveLock = [[NSRecursiveLockalloc]init];

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

[recursiveLock lock];

[recursiveLock unlock];

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("NSRecursiveLock used : %f\n", timeCurrent-timeBefore);

//pthread_mutex

pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

pthread_mutex_lock(&mutex);

pthread_mutex_unlock(&mutex);

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("pthread_mutex used : %f\n", timeCurrent-timeBefore);

//dispatch_semaphore

dispatch_semaphore_t semaphore =dispatch_semaphore_create(1);

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);

dispatch_semaphore_signal(semaphore);

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("dispatch_semaphore used : %f\n", timeCurrent-timeBefore);

//OSSpinLockLock

OSSpinLock spinlock = OS_SPINLOCK_INIT;

timeBefore = CFAbsoluteTimeGetCurrent();

for(i=0; i<count; i++){

OSSpinLockLock(&spinlock);

OSSpinLockUnlock(&spinlock);

}

timeCurrent = CFAbsoluteTimeGetCurrent();

printf("OSSpinLock used : %f\n", timeCurrent-timeBefore);

}

输出结果如下:

 

由图可以发现:
OSSpinLock的性能最好(不建议使用),GCD的dispatch_semaphore紧随其后; 
NSConditionLock和@synchronized性能较差;

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

转载于:https://www.cnblogs.com/soulDn/p/10558208.html

ios 各种锁的使用性能比较相关推荐

  1. iOS线程锁中你还不知道的内容

    iOS线程锁 一:十种线程锁 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. 这里顺便 ...

  2. bugku 管理员系统 后台代码_不会吧,这也行?iOS后台锁屏监听摇一摇

    [toc] 背景介绍 一般情况下,出于省电.权限.合理性等因素考虑,给人的感觉是很多奇怪的需求安卓可以实现,但是iOS就无法实现!今天要介绍的需求也有这种感觉,就是"当 APP 处于后台或锁 ...

  3. iOS 音乐 锁屏显示 控制

    1 APPDelegate.m 文件中 设置接收外部控制 - (BOOL)application:(UIApplication *)application didFinishLaunchingWith ...

  4. ios图锁HQ应用项目源码

    "图锁 HQ" 是一个专门为图片定制的超级保险箱! - 保证图片100%安全! - 使用无损压缩算法压缩图片, 节约空间资源. - 使用超高安全级别的加密算法加密图片. - 每次进 ...

  5. ios激活锁_如何检查iOS设备的激活锁状态

    ios激活锁 Starting with iOS 7, Apple introduced a feature named Activation Lock for iOS devices. When y ...

  6. [ios开发]锁屏后的相机的方向检查,与图片的自动旋转

    关键词:imageOrientation, 自动旋转, 获取方向, 锁屏, 图片方向, 自定义拍照 问题描述: 一个同事开发iphone拍照后为图片添加滤镜的功能. 发现添加滤镜时总出现方向自动变化的 ...

  7. IOS版aplayer使用教程_使用Checkra1n 越狱后成果绕过 iOS 激活锁教程

    本教程适用于macos 此方法绕过iCloud不能正常登陆账号和登陆AppStore 如果遗忘 iOS 设备的 Apple ID 密码,在重新激活时可以按照以下步骤绕过 Apple ID,实现免激活直 ...

  8. iOS 自动锁屏 设置

    // 自动锁屏 [UIApplication sharedApplication].idleTimerDisabled = NO; // 不自动锁屏 [UIApplication sharedAppl ...

  9. iOS - Mac 锁屏快捷键设置

    Mac 锁屏快捷键设置 control + shift + Eject 锁屏快捷键 如果用户要离开电脑一段时间,可以选择直接把笔记本直接合上.但是这样原先在跑的进程就会挂起或者结束,如果正在下载,那么 ...

最新文章

  1. python之⾯向对象-多态
  2. Pri3D:一种利用RGB-D数据固有属性完成3D场景感知的表示学习方法
  3. SVN项目锁定解决方案
  4. php检测http状态码,php回来HTTP状态码
  5. 关于CacheLookup一个有趣的问题
  6. ListView已到底部和顶部的判断
  7. Coding: 编写合格的REST API
  8. 敏捷回顾会议的套路与实践分享
  9. AT4519-[AGC032D]Rotation Sort【dp】
  10. 内推|商汤科技深度学习方向实习生
  11. MySQL(12)--- 插入数据
  12. Android大学课件SQLite3 数据库操作
  13. 32岁领导的忠告:别把报表不当回事,早点放弃Excel才是出路
  14. 升降压斩波电路matlab,升降压斩波电路的MATLAB 仿真.pptx
  15. 大数据技术及大数据架构
  16. 一步一步教你做微博用户画像分析:Python微博爬虫+词云生成
  17. Microsoft 提供的 USB 驱动程序
  18. 关于clob字段的使用 ORA-22835:缓冲区对于CLOB到CHAR转换而言太小异常
  19. 许知远:嗨!Julia
  20. windows 7 数据执行保护 开启关闭方法

热门文章

  1. 快慢结合搞定网站优化排名(二)-内链
  2. Microsoft.NET多国语言资源解决方案
  3. 有关cookie实现统计pv,uv的一些用法
  4. windows环境下注册安装GitHub Desktop使用方法详解
  5. 呼叫中心服务器怎么设置,本地呼叫中心和云呼叫中心服务器部署方式
  6. 串的模式匹配(KMP算法)
  7. centos 安装mysql扩展_centos php安装mysql扩展的方法
  8. 【Docker系列教程之三】Docker容器是如何工作的
  9. 多线程---ReentrantLock
  10. springcloud记录篇6-分布式配置中心