Каков результат вызова DispatchQueue.global().sync?

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

Ответ

Вызов DispatchQueue.global().sync { ... } выполняет переданный блок кода синхронно на глобальной concurrent очереди.

Последствия:

  1. Блокировка вызывающего потока: Текущий поток приостанавливается и ждет, пока блок не выполнится полностью.
  2. Выполнение на фоновом потоке: Блок будет выполнен на одном из потоков системной глобальной очереди (не на главном).
  3. Порядок выполнения: Несмотря на то, что DispatchQueue.global() — concurrent очередь, sync заставляет блок выполняться последовательно относительно вызывающего кода.

Пример, демонстрирующий блокировку:

print("Task 1 started on main thread")
DispatchQueue.global().sync {
    // Этот блок выполняется на фоновом потоке, НО main thread ждет его завершения.
    Thread.sleep(forTimeInterval: 1)
    print("Task 2 executed on global queue")
}
// Эта строка напечатается только после завершения блока выше.
print("Task 3 continues on main thread")
// Вывод: "Task 1 started...", (пауза 1 сек), "Task 2 executed...", "Task 3 continues..."

⚠️ Важное предупреждение о взаимоблокировке (deadlock):

// НЕ ДЕЛАЙТЕ ТАК. Это вызовет deadlock.
DispatchQueue.main.sync {
    // Этот код никогда не выполнится, потому что main thread
    // заблокирован внешним вызовом и ждет этого блока,
    // но сам блок тоже требует main thread.
}
// Вызов `sync` на текущей очереди (или на очередь, которая ждет текущую) приводит к deadlock.