NSLock死锁及解决办法
代码如下:
-(void)methodA
{
self.lock = [[NSLock alloc]init];
[self.lock lock];
NSLog(@"1");
[self methodB];
NSLog(@"2");
[self.lock unlock];
}
-(void)methodB
{
[self.lock lock];
NSLog(@"3");
[self.lock unlock];
}
输出结果:1
这就照成了死锁
原因如下:由于当前线程运行到第一个lock加锁,现在再次运行到lock同样的锁,需等待当前线程解锁,把当前线程挂起,不能解锁
NSLock是非递归锁,当同一线程重复获取同一非递归锁时,就会发生死锁
解决办法:
我们可以用NSRecursiveLock或者@synchronized替代NSLock
因为NSRecursiveLock或者@synchronized都是递归锁,
递归锁:它允许同一线程多次加锁,而不会造成死锁。