Что такое Dead Lock

«Что такое Dead Lock» — вопрос из категории Golang, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Deadlock — это ситуация, когда две или более горутины блокируют друг друга, ожидая освобождения ресурса, который удерживает другая. Это приводит к бесконечному ожиданию.

Пример:

package main

import (
    "sync"
    "time"
)

func main() {
    var mu1, mu2 sync.Mutex

    go func() {
        mu1.Lock()
        defer mu1.Unlock()
        time.Sleep(100 * time.Millisecond)
        mu2.Lock() // Ждёт mu2, но её удерживает другая горутина
        defer mu2.Unlock()
    }()

    go func() {
        mu2.Lock()
        defer mu2.Unlock()
        time.Sleep(100 * time.Millisecond)
        mu1.Lock() // Ждёт mu1, но её удерживает первая горутина
        defer mu1.Unlock()
    }()

    time.Sleep(1 * time.Second) // Даём горутинам время на deadlock
}

Как избежать:

  1. Упорядочивать захват мьютексов (например, всегда сначала mu1, потом mu2).
  2. Использовать sync.RWMutex или каналы.
  3. Применять таймауты (TryLock, select с time.After).