iOS【锁相关】
2020-06-11 本文已影响0人
NJ_墨
NSLock *lock = [[NSLock alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
static void (^TestMethod)(int);
TestMethod = ^(int value) {
[lock lock];
if (value > 0) {
NSLog(@"value = %d", value);
TestMethod(value - 1);
}
[lock unlock];
};
TestMethod(10);
});
value = 10
结果只会输出10
TestMethod是递归调用,每次调用这个block时,都会加一次锁,第二次调用时,由于第一次的锁还没有解锁,所以它需要等待锁被解除,这样就导致了死锁,线程被阻塞住了
如果使用-递归锁
-NSRecursiveLock
将NSLock换成NSRecursiveLock;
结果可以输出10....1;
因为NSRecursiveLock,允许同一线程多次加锁,而不会造成死锁。
递归锁会跟踪它被锁的次数。每次lock都必须平衡调用unlock操作。
只有当所有的锁达到平衡,锁最后才能被释放。
NSLock
NSLock 是对 pthread_mutex(互斥) 普通锁的封装。
遵守 NSLocking 协议
它的两个方法
- (BOOL)tryLock;
- (BOOL)lockBeforeDate:(NSDate *)limit;
-(BOOL)lockBeforeDate:(NSDate *)limit;
传入一个时间,在这时间之前如果这把锁放开的话,就给这把锁加锁。
如果时间没到就一直在这里等。
由于 NSLock 是互斥锁,所以等待的时间就是睡觉。
如果时间到了,还没有等到锁。就加锁失败。
-(BOOL)tryLock;
尝试加锁
NSLocking 协议里面有两个方法
/// 加锁
- (void)lock;
- /// 解锁
- (void)unlock;