В чем разница между синхронными (sync) и асинхронными (async) операциями?

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

Ответ

Разница заключается в блокировке текущего потока выполнения.

  • sync (синхронно): Вызывающий поток блокируется и ожидает полного завершения переданной задачи, прежде чем продолжить выполнение следующей строки кода.
  • async (асинхронно): Задача ставится в очередь на выполнение, а вызывающий поток немедленно продолжает работу, не дожидаясь её окончания.

Пример на Swift (Grand Central Dispatch):

let queue = DispatchQueue.global(qos: .background)

// Синхронный вызов (блокирующий)
queue.sync {
    sleep(1) // Имитация долгой задачи
    print("1. Sync task completed")
}
print("2. After sync call") // Выведется вторым

// Асинхронный вызов (неблокирующий)
queue.async {
    sleep(1)
    print("3. Async task completed")
}
print("4. After async call") // Выведется сразу, может быть третьим или четвертым

Вывод и ключевые моменты:

1. Sync task completed
2. After sync call
4. After async call
3. Async task completed
  • sync используется для синхронизации доступа к общим ресурсам (как примитив синхронизации) или когда следующий код критически зависит от результата задачи.
  • async используется для фоновых операций, чтобы не блокировать основной поток (например, для сетевых запросов или тяжелых вычислений).
  • Важно: Вызов sync на текущей очереди (особенно на главной) приводит к взаимной блокировке (deadlock).