В чем разница между последовательной (Serial) и параллельной (Concurrent) очередью в iOS?

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

Ответ

Serial DispatchQueue выполняет задачи строго по очереди, одна за другой. Concurrent DispatchQueue может запускать несколько задач одновременно, используя доступные потоки системы.

Ключевые отличия:

  • Порядок выполнения: Serial гарантирует FIFO (First-In-First-Out) порядок задач. Concurrent обеспечивает порядок только начала задач, но не их завершения.
  • Производительность: Concurrent может повысить производительность за счет параллелизма на многоядерных системах.
  • Безопасность потоков: Serial по своей природе потокобезопасна для доступа к общему ресурсу из своих задач. Concurrent требует явной синхронизации (барьеры, блокировки).

Пример создания очередей:

// Последовательная очередь (по умолчанию)
let serialQueue = DispatchQueue(label: "com.app.serialQueue")

// Параллельная очередь
let concurrentQueue = DispatchQueue(label: "com.app.concurrentQueue", attributes: .concurrent)

// Использование
serialQueue.async {
    print("Task 1 on serial queue")
}
concurrentQueue.async {
    print("Task A on concurrent queue")
}

Когда использовать:

  • Serial: Для задач, требующих строгого порядка или работы с общим ресурсом без сложной синхронизации.
  • Concurrent: Для независимых, ресурсоемких задач, которые можно выполнять параллельно (например, обработка изображений).