TGViewer
Golang | Вопросы собесов Golang | Вопросы собесов @easy_golang · 4.68K subscribers
Post #2832 294
🤔 Как избежать deadlock?

Это ситуация, когда несколько горутин (или потоков) находятся в состоянии ожидания друг друга, из-за чего выполнение программы останавливается. В Go deadlock может произойти при неправильной работе с каналами, мьютексами и другими механизмами синхронизации.

🚩Чтобы избежать deadlock, нужно следовать этим принципам

🟠Грамотно проектировать порядок блокировок
Если несколько горутин используют блокировки (например, через мьютексы), убедитесь, что все они захватывают их в одном и том же порядке.
func main() {
var mu1, mu2 sync.Mutex

go func() {
mu1.Lock()
defer mu1.Unlock()

mu2.Lock()
defer mu2.Unlock()
}()

go func() {
mu2.Lock()
defer mu2.Unlock()

mu1.Lock()
defer mu1.Unlock()
}()
}


🟠Не блокировать каналы навсегда
Каналы должны всегда иметь возможность отправки и получения данных. Если одна сторона (отправитель или получатель) заблокирована навсегда, возникает deadlock.
func main() {
ch := make(chan int)
ch <- 42 // Deadlock, так как никто не читает из канала
}


🟠Закрывайте каналы правильно
Каналы нужно закрывать только со стороны отправителя, и только тогда, когда больше не будет отправок данных. Неправильное закрытие или отсутствие закрытия может привести к проблемам, включая deadlock.
ch := make(chan int)
close(ch) // Закрыт слишком рано
ch <- 42 // Паника


🟠Избегайте ситуаций с ожиданием себя
Иногда deadlock происходит, если горутина ждет сама себя.
func main() {
ch := make(chan int)
ch <- 1
fmt.Println(<-ch) // Никогда не выполнится
}


🟠Использовать тайм-ауты и селекторы
Go позволяет избегать блокировок с помощью механизма тайм-аутов и оператора select. Если операция занимает слишком много времени, можно выполнить альтернативное действие.
func main() {
ch := make(chan int)

select {
case data := <-ch:
fmt.Println("Получены данные:", data)
case <-time.After(1 * time.Second):
fmt.Println("Тайм-аут, завершение")
}
}


🟠Используйте инструменты анализа
Go предоставляет утилиту go run -race, которая помогает выявлять гонки данных и другие проблемы, связанные с синхронизацией.
go run -race main.go


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
More from @easy_golang
  1. Oct 9, 2026Post #2841
  2. Oct 9, 2026🤔 Что такое CI/CD? Это подход к автоматизации сборки, тестирования и развертывания прилож…
  3. Oct 9, 2026Post #2839
  4. Oct 9, 2026🤔 Какие бывают способы оптимизации? Оптимизация кода в Go может быть выполнена на несколь…
  5. Oct 8, 2026Post #2837
  6. Oct 8, 2026🤔 Как встроить стандартный профайлер в своё приложение? Интегрируйте профайлер с помощью…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →