Вопрос проверяет понимание типов блокировок и их поведения в многопоточной среде.
NSLock — это нерекурсивный лок. Если поток попытается захватить его повторно, это приведет к deadlock. Для рекурсивных блокировок используйте NSRecursiveLock.
1. Обычный NSLock:
Запрещает повторный захват одним потоком.
Пример deadlock:
let lock = NSLock()
lock.lock()
lock.lock() // Deadlock! Поток заблокирует сам себя.2. NSRecursiveLock:
Позволяет многократный захват одним потоком.
Пример:
let recursiveLock = NSRecursiveLock()
func recursiveMethod(_ count: Int) {
recursiveLock.lock()
defer { recursiveLock.unlock() }
if count > 0 { recursiveMethod(count - 1) }
}Вывод:
Используйте NSRecursiveLock для рекурсивных вызовов, иначе — NSLock.