iOS多线程安全,引出各种锁(下)
2022-05-29 本文已影响0人
皮皮他爸
5、NSConditionLock

NSConditionLock其实就是对NSCondition的又一层封装,添加了依赖条件,这样就可以控制锁的顺序

6、NSRecursiveLock

NSRecursiveLock跟NSLock的api一模一样,唯一不同的是上面的NSLock是不能递归的,而NSRecursiveLock是可以递归调用的(可以重复的加锁、解锁)

看看NSRecursiveLock源码内容:


一目了然,就是pthread的封装,添加了一个pthread_mutexattr_settype(attrs,type)
设置了一个PTHREAD_MUTEX_RECURSIVE属性。
那递归锁究竟有什么作用呢?
看下面的例子

如果用NSLock肯定会死锁,线程卡死。只能输出了一次10

warnning:递归锁也有自己需要注意的情况,就是不同的线程去递归调用同一个递归锁,同样会出现死锁崩溃的情况:

这个时候小伙伴是不是有点懵逼,锁本来就是处理多线程访问同一块内存防止错乱。递归锁可以被多个线程同时加锁,但是解锁的时候会互相等待导致死锁的情况。
如果需要多线程实现递归加锁的功能,可以使用@synchronized

7、读写锁
读写锁的特性:多读单写,读写互斥

需要创建一个并发队列,这样可以保证读的操作可以实现多读,然后通过一个栅栏函数可以实现同一个队列里面写的操作在读之后。读的操作使用一个同步方法,可以保证ret值的正确性。