5、NSConditionLock
image.pngNSConditionLock其实就是对NSCondition的又一层封装,添加了依赖条件,这样就可以控制锁的顺序
image.png6、NSRecursiveLock
image.pngNSRecursiveLock跟NSLock的api一模一样,唯一不同的是上面的NSLock是不能递归的,而NSRecursiveLock是可以递归调用的(可以重复的加锁、解锁)
image.png
看看NSRecursiveLock源码内容:
一目了然,就是pthread的封装,添加了一个pthread_mutexattr_settype(attrs,type)
设置了一个PTHREAD_MUTEX_RECURSIVE属性。
那递归锁究竟有什么作用呢?
看下面的例子
image.png
如果用NSLock肯定会死锁,线程卡死。只能输出了一次10
image.png
warnning:递归锁也有自己需要注意的情况,就是不同的线程去递归调用同一个递归锁,同样会出现死锁崩溃的情况:
这个时候小伙伴是不是有点懵逼,锁本来就是处理多线程访问同一块内存防止错乱。递归锁可以被多个线程同时加锁,但是解锁的时候会互相等待导致死锁的情况。
如果需要多线程实现递归加锁的功能,可以使用@synchronized
7、读写锁
读写锁的特性:多读单写,读写互斥
image.png
需要创建一个并发队列,这样可以保证读的操作可以实现多读,然后通过一个栅栏函数可以实现同一个队列里面写的操作在读之后。读的操作使用一个同步方法,可以保证ret值的正确性。
网友评论