ios--线程锁🔐
2020-01-09 本文已影响0人
简鱼7819
ios中能用做线程锁的很多,也有很多人梳理解释过。我自己再梳理写一遍代码~
方式
OSSpinLock 、dispatch_semaphore 、os_unfair_lock 、spthread_mutex
NSLock 、pthread_mutex(recursive)、NSRecursiveLock 、NSConditionLock
@synchronized
其中NSLock和@synchronized是开发中经常遇到使用的。其他的dispatch_semaphore是之前梳理GCD又学习到的,至于剩下的表示见过没有写过。
借用一位作者的举例,他的一系列GCD让我很有受益。奔跑吧小蚂蚁
举例:两个火车票销售窗口 共同销售车站总共的50张车票
一、GCD的dispatch_semaphore实现线程锁
![](https://img.haomeiwen.com/i1782551/8065f1ee9dc51355.png)
以上是售卖火车票的代码
semaphore实现
![](https://img.haomeiwen.com/i1782551/535fb31342a7b5ad.png)
二、NSLock实现
![](https://img.haomeiwen.com/i1782551/ffc8ee2aac8b4f0b.png)
三、@synchronized实现
![](https://img.haomeiwen.com/i1782551/70caab13074c7951.png)
四、pthread_mutex线程锁实现
![](https://img.haomeiwen.com/i1782551/05de58e2c2bfe9ea.png)
注意:pthread_mutex宏初始化是需要ios10以上才能支持。
五、NSCondition实现
![](https://img.haomeiwen.com/i1782551/0b82112e233f1960.png)
NSCondition和NSConditionLock实现一样,只是类不一样。
其他的就不一一列举了。
六、总结
1,实现线程锁的方式多种多样;
2,锁也分多种:自旋锁、互斥锁、条件锁、递归锁。其中pthread_mutex是典型的互斥锁,@synchronized()是递归锁,NSCondition是条件锁,NSLock是互斥锁,dispatch_semaphore是信号量能实现线程锁的功能
3,NSLock是对pthread_mutex的进一步对象封装,NSRecursiveLock和NSConditionLock也一样,都是对pthread_mutex各类模式进一步封装。
4,以上列举的线程锁性能排列:dispatch_semaphore最高,NSLock次之,NSCondition再次之,@synchronized()末次!
参考链接