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;
上一篇 下一篇

猜你喜欢

热点阅读