联系人:石虎 QQ:1224614774  昵称: 嗡嘛呢叭咪哄

                         QQ群:807236138  群称: iOS 技术交流学习群

一、概念

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

效率图:

二、锁?锁

OSSpinLock (自旋锁)

      自旋锁的实现原理比较简单,就是死循环。当a线程获得锁以后,b线程想要获取锁就需要等待a线程释放锁。在没有获得锁的期间,b线程会一直处于忙等的状态。如果a线程在临界区的执行时间过长,则b线程会消耗大量的cpu时间,不太划算。所以,自旋锁用在临界区执行时间比较短的环境性能会很高。

注:苹果爸爸已经在iOS10.0以后废弃了这种锁机制,使用os_unfair_lock 替换,

     顾名思义能够保证不同优先级的线程申请锁的时候不会发生优先级反转问题.

os_unfair_lock(自旋锁)

注:解决不同优先级的线程申请锁的时候不会发生优先级反转问题.

    不过相对于 OSSpinLock , os_unfair_lock性能方面减弱了许多.

dispatch_semaphore (信号量)

注: dispatch_semaphore  其他两个功能

     1.还可以起到阻塞线程的作用.

     2.可以实现定时器功能,这里不做过多介绍.

pthread_mutex(互斥锁)

pthread_mutex表示互斥锁,和信号量的实现原理类似,也是阻塞线程并进入睡眠,需要进行上下文切换。

pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL);pthread_mutex_t lock;
pthread_mutex_init(&lock, &attr);    //设置属性pthread_mutex_lock(&lock);    //上锁
//需要执行的代码
pthread_mutex_unlock(&lock);    //解锁

NSLock(互斥锁、对象锁)

NSLock在内部封装了一个 pthread_mutex,属性为 PTHREAD_MUTEX_ERRORCHECK。

NSLock *lock = [NSLock new];[lock lock];//需要执行的代码[lock unlock];

NSCondition(条件锁、对象锁)

NSCondition封装了一个互斥锁和条件变量。互斥锁保证线程安全,条件变量保证执行顺序。

NSCondition *lock = [NSCondition new];[lock lock];//需要执行的代码[lock unlock];

pthread_mutex(recursive)(递归锁)

pthread_mutex锁的一种,属于递归锁。一般一个线程只能申请一把锁,但是,如果是递归锁,则可以申请很多把锁,只要上锁和解锁的操作数量就不会报错。

pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);pthread_mutex_t lock;
pthread_mutex_init(&lock, &attr); //设置属性pthread_mutex_lock(&lock);       //上锁
//需要执行的代码
pthread_mutex_unlock(&lock);     //解锁

注: 递归锁可以被同一线程多次请求,而不会引起死锁。

即在同一线程中在未解锁之前还可以上锁, 执行锁中的代码。

这主要是用在循环或递归操作中。

NSRecursiveLock(递归锁、对象锁)

递归锁,pthread_mutex(recursive)的封装。

NSRecursiveLock *lock = [NSRecursiveLock new];[lock lock];//需要执行的代码[lock unlock];

NSConditionLock(条件锁、对象锁)

NSConditionLock借助 NSCondition 来实现,本质是生产者-消费者模型。

NSConditionLock *lock = [NSConditionLock new];[lock lock];//需要执行的代码[lock unlock];

@synchronized(条件锁)

一个对象层面的锁,锁住了整个对象,底层使用了互斥递归锁来实现。

NSObject *object = [NSObject new];@synchronized(object) {//需要执行的代码}

三、总结

@synchronized互斥锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会进入睡眠状态等待任务执行完毕,当上一个线程的任务执行完毕,下一个线程会自动唤醒然后执行任务。

应用场景: @synchronized:适用线程不多,任务量不大的多线程加锁

注意点:
1.如果多线程访问同一个资源,那么必须使用同一把锁才能锁住
2.在开发中,尽量不要加锁,能在服务端做尽量在服务端做,如果必须要加锁,一定要记住,锁的范围不能太大,哪里有安全隐患就加在哪里。
3.技巧:因为必须使用同一把锁,开发中如果需要加锁,直接使用 self 即可。
@synchronized(self) {//加锁

}//解锁

atomic 自旋锁:当上一个线程的任务没有执行完毕的时候(被锁住),那么下一个线程会一直等待(不会睡眠),当上一个线程的任务执行完毕,下一个线程会立即执行。

atomic 自旋锁应用场景:比较适合做一些不耗时的操作

注意点:
只会给 setter 方法加锁,并不会给getter方法加锁。

NSLock:其实NSLock并没有想象中的那么差,不知道大家为什么不推荐使用

dispatch_semaphore_t:使用信号来做加锁,性能提升显著

NSCondition:使用其做多线程之间的通信调用不是线程安全的

NSConditionLock:单纯加锁性能非常低,比NSLock低很多,但是可以用来做多线程处理不同任务的通信调用

NSRecursiveLock:递归锁的性能出奇的高,但是只能作为递归使用,所以限制了使用场景

NSDistributedLock:因为是MAC开发的,就不讨论了

POSIX(pthread_mutex):底层的api,复杂的多线程处理建议使用,并且可以封装自己的多线程

OSSpinLock:性能也非常高,可惜出现了线程问题

dispatch_barrier_async/dispatch_barrier_sync:测试中发现dispatch_barrier_sync比dispatch_barrier_async性能要高,真是大出意外

参考https://mp.weixin.qq.com/s?__biz=MzA3NzM0NzkxMQ==&mid=2655360357&idx=1&sn=081b7b883c338a4b6ded65fbbd6a0982&chksm=84e2584db395d15b9c962acd4433364bfae7d7db73b631baf929ad054e0965189dc6a41a77a6&mpshare=1&scene=1&srcid=#rd

谢谢!!!

本账号主要分享我成长过程中的各种心得感悟,包括技术总结, iOS、Swift 和 Mac 相关技术文章、工具资源、参与技术讨论,整理开发技巧、让学习成为一种享受!

iOS 安全锁原理集合相关推荐

  1. iOS底层原理 - 常驻线程

    iOS底层原理 - 常驻线程 在 AFN 2.0 时代,会经常看到 AFN 创建一个常驻线程的方式: 0️⃣ AFN 2.0 时代的常驻线程 + (NSThread *)networkRequestT ...

  2. iOS底层原理之架构设计

    文章目录 何为架构? MVC - Apple版 MVC – 变种 MVP MVVM 设计模式 面试题 何为架构? 架构(Architecture):软件开发中的设计方案,类与类之间的关系.模块与模块之 ...

  3. iOS底层原理探究 第一探. 事件传递和响应者链

    一. 声明:  本文意在探讨, 也参考了几位大神的文章, 在最后我会把链接发出来, 如果有理解错误的地方, 请大神们指正哈! 二. 前言:  最近自己做项目的时候, 用到了UITabbarContro ...

  4. iOS底层原理之内存管理

    文章目录 定时器 CADisplayLink.NSTimer GCD定时器 内存管理 iOS程序的内存布局 Tagged Pointer OC对象的内存管理 拷贝 引用计数的存储 dealloc 自动 ...

  5. ios动画原理 modelLayer和presentationLayer以及点击交互

    ios动画原理 modelLayer和presentationLayer以及点击交互 我们知道,iOS的动画,和其对应的layer有关. 之前在开发的过程中碰到一个问题,那就是,在一个视图的动画过程中 ...

  6. 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...

  7. IOS第三方框架集合

    简   注册 登录  添加关注 作者 xuejunjun 2015.06.06 17:39* 写了14057字,被17人关注,获得了116个喜欢 IOS第三方框架集合 字数6100 阅读17132 评 ...

  8. iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍         得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...

  9. ReactNative与iOS通信原理解析-通信篇

    文章首发个人博客: ReactNative与iOS通信原理解析-通信篇 导语:其实原本是想编写一篇  react-native (下文简称 rn) 在  iOS 中如何实现  jsbridge 的文章 ...

  10. iOS常用第三方集合(六)

    代码安全与密码 ios-class-guard- 一个用于混淆iOS的类名.方法名以及变量名的开源库--有人反映编译出来的app运行不了. <Protecting iOS Application ...

最新文章

  1. .sln from VS2005 convert to VS2008
  2. ANSYS提取刚度矩阵
  3. 5.4广义表的定义5.5广义表的存储结构
  4. vSphere 5.0热添加
  5. 方法覆盖(重写)和方法重载
  6. spark on yarn模式:yarn命令杀除当前的application
  7. Kofi's back
  8. code1068 乌龟棋
  9. 文华软件怎样测试交易系统的收益,交易系统的测试与评估报告
  10. 9 ASCLL 码表
  11. 计算机金融sci,FINANCE AND STOCHASTICS《金融与随机分析》SSCI论文投稿_SSCI期刊大全_SSCI期刊点评_万维书刊网...
  12. iTEXT将html文档转PDF,spire.doc包html转word(包括样式修改和添加图片/页码等设置)
  13. windows10虚拟机下载
  14. win10资源管理器卡死无响应终极解决办法(亲测有效)
  15. PPT双屏,设置主屏
  16. C++智能指针入门之unique_ptr
  17. 记一次android任务栈页面跳转问题
  18. APS高级计划排程和生产计划排产系统电子行业的解决方案
  19. 解决Windows10系统ping外网不通的问题
  20. File “h5py\h5.pyx“, line 1, in init h5py.h5 ImportError: DLL load failed whi

热门文章

  1. bex5 php,BeX5企业微信集成
  2. OPPO手机刷机解锁救砖解账户锁方法
  3. php字符串指定长度截取,php 截取指定长度字符串的代码分享
  4. 工业园区与大型制造工厂企业食堂消费管理系统常见需求及解决方案
  5. Web全栈工程师基本素养
  6. MATLAB学习与使用:矩阵的运算
  7. matlab的矩阵运算,MATLAB的矩阵运算
  8. UG数控编程显示和隐藏的快捷键
  9. STM32F4开发-新建工程
  10. echarts地图随机点生成