Добавить объявление

Deadlock и Livelock: чем опасны и как избежать

Deadlock - это тупик. Когда два потока блокируют друг друга, бесконечно ожидая освобождения ресурсов, которые каждый из них удерживает.

Пример:


  • Поток 1: держит доступ к базе и ждет сетевой ответ.

  • Поток 2: держит сеть и ждет доступ к базе.


Как предотвратить:


  • Устанавливайте строгий порядок блокировки ресурсов.

  • Используйте асинхронные вызовы вместо синхронных.



Livelock - это бег на месте. Ситуация, при которой два или более потока не могут выполнять полезной работы по причине борьбы за общий ресурс.

Пример:


Два потока постоянно меняют флаг «готовности», но реальной работы не происходит.

Как исправить:


  • Добавляйте случайные задержки между повторными попытками.

  • Используйте семафоры для контроля доступа.

  • Используйте барьеры.


Главное отличие:


Deadlock - полная остановка, Livelock - активность без прогресса.


В Swift особенно актуально при работе с:

  • GCD

  • OperationQueue

  • Новыми Actor-ами
21.06.2025 16 18