Sobes.tech
Назад к вопросам
Junior
785
questionbank

Что такое дедлоки?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Дедлок — это ситуация, когда две или больше горутин/потоков навсегда ждут друг друга и выполнение останавливается. Обычно это происходит, когда ресурсы захватываются в разном порядке или есть циклическая зависимость между блокировками. В Go это может проявляться как зависание программы или panic с сообщением о deadlock, если все goroutine заблокированы.

Определение:

Дедлок — это взаимная блокировка, при которой ни одна из участвующих сторон не может продолжить работу, потому что каждая ожидает ресурс, удерживаемый другой стороной.
В многопоточном и конкурентном коде это чаще всего связано с mutex, каналами, транзакциями или другими синхронизационными примитивами.

Пример использования:

Типичный пример в Go — одна goroutine пытается отправить значение в небуферизованный канал, но получателя нет, а другая в это время ждёт отправку в обратную сторону или держит mutex, необходимый первой goroutine.

package main

func main() {
	ch := make(chan int)

	ch <- 1 // отправка блокируется, потому что никто не читает из канала
}

Пояснение кода:

Код выше создает небуферизованный канал. Отправка в такой канал блокируется до тех пор, пока кто-то не начнет читать из него.
Здесь чтения нет вообще, поэтому main зависает. В реальном приложении Go может завершить программу с ошибкой вида fatal error: all goroutines are asleep - deadlock!.

Ключевые моменты:

  • Дедлок возникает, когда участники ждут друг друга и никто не может продолжить выполнение.
  • Частая причина — разный порядок захвата ресурсов, например mutex'ов.
  • В Go дедлоки часто связаны с каналами, блокировками и ожиданием завершения goroutine.
  • Избежать дедлока помогает единый порядок захвата ресурсов, таймауты и аккуратная работа с каналами.
  • Важно отличать дедлок от обычной долгой операции: при дедлоке прогресс невозможен вообще.