Deadlock - это тупик. Когда два потока блокируют друг друга, бесконечно ожидая освобождения ресурсов, которые каждый из них удерживает.
Пример:
- Поток 1: держит доступ к базе и ждет сетевой ответ.
- Поток 2: держит сеть и ждет доступ к базе.
Как предотвратить:
- Устанавливайте строгий порядок блокировки ресурсов.
- Используйте асинхронные вызовы вместо синхронных.
Livelock - это бег на месте. Ситуация, при которой два или более потока не могут выполнять полезной работы по причине борьбы за общий ресурс.
Пример:
Два потока постоянно меняют флаг «готовности», но реальной работы не происходит.
Как исправить:
- Добавляйте случайные задержки между повторными попытками.
- Используйте семафоры для контроля доступа.
- Используйте барьеры.
Главное отличие:
Deadlock - полная остановка,
Livelock - активность без прогресса.
В Swift особенно актуально при работе с:
- GCD
- OperationQueue
- Новыми Actor-ами