Что такое race condition и deadlock?

Deadlock — ситуация, когда несколько горутин (или потоков) блокируют друг друга, ожидая освобождения ресурсов, которые заняты друг другом, и в итоге ни одна не может продолжить работу.

Короткий ответ

Что ответить на собеседовании

Deadlock — ситуация, когда несколько горутин (или потоков) блокируют друг друга, ожидая освобождения ресурсов, которые заняты друг другом, и в итоге ни одна не может продолжить работу.

Подробный разбор

Ответ с пояснениями

Deadlock — ситуация, когда несколько горутин (или потоков) блокируют друг друга, ожидая освобождения ресурсов, которые заняты друг другом, и в итоге ни одна не может продолжить работу.

Race condition — состояние гонки, когда результат работы программы зависит от непредсказуемого порядка выполнения горутин, что приводит к ошибкам или некорректным данным.

Как бороться:

  • Для deadlock:

    • Избегать вложенных блокировок.
    • Использовать таймауты при захвате мьютексов.
    • Проектировать логику так, чтобы все горутины захватывали ресурсы в одном порядке.
  • Для race condition:

    • Использовать синхронизацию: мьютексы, каналы.
    • Избегать совместного доступа к изменяемым данным без защиты.
    • Использовать инструменты go race detector (go run -race) для выявления гонок.

Пример race condition:

var counter int

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    counter++ // небезопасно без мьютекса
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println(counter) // может быть меньше 1000 из-за гонок
}

Исправление — добавить мьютекс вокруг изменения counter.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее