面试题答案
一键面试锁机制选择分析
- NSLock
- 优点:简单易用,提供基本的互斥功能,能确保同一时间只有一个线程可以访问共享资源。
- 缺点:不支持递归调用,如果在递归代码块中使用,会导致死锁。因为每次递归调用尝试加锁时,由于锁已经被持有,线程会等待锁被释放,但持有锁的线程正是当前递归线程,所以会陷入死循环等待。对于需要满足特定条件才能执行的操作,NSLock没有提供直接支持,需要额外的条件判断逻辑。
- 是否适用该场景:不适用,因为场景中有递归调用部分,NSLock无法处理递归导致的死锁问题。
- NSRecursiveLock
- 优点:支持递归调用,允许同一线程多次获取锁而不会导致死锁。这对于递归代码块非常友好,每次递归调用都能成功获取锁,保证递归函数的正常执行。同时它也提供基本的互斥功能,能保护共享资源。
- 缺点:对于需要满足特定条件才能执行的操作,NSRecursiveLock没有提供直接支持,和NSLock一样,需要额外编写条件判断逻辑。
- 是否适用该场景:部分适用,它能解决递归调用的问题,但对于特定条件执行操作的支持不足。
- NSConditionLock
- 优点:既支持条件判断,又支持基本的互斥功能。可以在初始化时设置一个条件值,线程获取锁时可以指定需要满足的条件,只有条件匹配时才能获取到锁,这对于部分操作需要满足特定条件才能执行的场景非常适用。同时它也能处理递归调用场景下的锁获取问题,不会导致死锁。
- 缺点:相比NSLock和NSRecursiveLock,NSConditionLock的使用相对复杂一些,需要更细致地管理条件值的设置和判断。
- 是否适用该场景:适用,它既能处理递归调用,又能满足特定条件操作执行的需求,虽然使用稍复杂,但能很好适配该复杂场景。
结论
在该复杂场景下,NSConditionLock是最合适的选择。它综合了处理递归调用和满足特定条件执行操作的能力,虽然使用上较复杂,但能全面满足场景需求,而NSLock和NSRecursiveLock在功能完整性上存在不足。