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. Bootstrap系列 -- 8. 代码显示
  2. 张萍萍山东大学计算机科学系毕业生,并行驰骋,放“码”来战!看先导杯大奖赛上山大风采...
  3. 闭包/Block当成函数参数实现回调
  4. Perl重命名当前目录下的文件
  5. RAID磁盘阵列配置和调优小结
  6. C++中对象初始化赋值是否需要调用operator=函数
  7. LLDP(链路层发现协议)
  8. 了解一个新技术和技术点的时候需要了解的事情
  9. HTML5:web socket 和 web worker
  10. Linux内核快速处理路径尽量多用slab而慎用kmalloc
  11. RBAC权限认证流程图
  12. 单商户商城系统功能拆解19—订单管理
  13. 浅谈JSP编程的网店管理系统构造
  14. java后端生成echarts图片
  15. 重新训练大脑!这些APP可治愈心理疾病
  16. POJ-3376 Finding Palindromes
  17. 使用VMware虚拟机通过Panabit抓取爱快虚拟机PPPoE报文
  18. Android学习日记(yzy):Notification的简单运用
  19. unity3D灯光烘焙(二)
  20. .net core 3.1JWT用户权限认证(二)获取token

热门文章

  1. Android学习笔记之(一)开发环境搭建
  2. 阿里云镜像下载ubuntu
  3. ubuntu安装ipfs
  4. c语言课程设计学生成绩簿,c语言课程设计—学生成绩管理系统
  5. c#ovalshape_How to: Draw Shapes with the OvalShape and RectangleShape Controls (Visual Studio)
  6. MySQL常用存储引擎
  7. 20175333曹雅坤实验四《Android程序设计》实验报告
  8. 实验二:编写输出Hello World!
  9. Js高级(1) 事件11.30
  10. hibernate 高并发下遇到的大坑