Что такое Lock (блокировка) в многопоточном программировании?

«Что такое Lock (блокировка) в многопоточном программировании?» — вопрос из категории Многопоточность, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Lock (блокировка) — это примитив синхронизации, который гарантирует, что только один поток в данный момент может выполнять защищённый участок кода или доступ к общему ресурсу. Это предотвращает состояние гонки (race condition) и обеспечивает целостность данных.

Пример использования NSLock в Swift:

let lock = NSLock()
var sharedCounter = 0

DispatchQueue.global().async {
    lock.lock()
    // Критическая секция
    sharedCounter += 1
    lock.unlock() // Важно: всегда разблокировать!
}

Основные типы блокировок в iOS/macOS:

  1. NSLock — базовая взаимная блокировка (mutex).
  2. NSRecursiveLock — позволяет одному и тому же потоку захватывать блокировку несколько раз без взаимной блокировки (deadlock) самого себя. Полезен в рекурсивных функциях.
  3. os_unfair_lock — высокопроизводительная блокировка из Darwin. Не является рекурсивной и должна использоваться с осторожностью.
  4. @synchronized (Objective-C) — устаревший подход, не рекомендуется к использованию в новом коде.

Важное правило: Всегда обеспечивайте выход из критической секции (вызов unlock()), даже в случае ошибки, чтобы избежать deadlock.