Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: lock, contention

Какие подходы позволяют уменьшить блокировки при конкурентной записи?

Вопрос проверяет понимание оптимизации конкурентного кода и уменьшения lock contention.

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

Блокировки можно уменьшить, используя шардирование данных, батчинг операций, атомарные операции или передачу данных через каналы. Это снижает конкуренцию за общий ресурс. Чем меньше критическая секция, тем выше производительность. Часто используется отдельная goroutine-обработчик.

Длинный ответ

При высокой конкурентности основная проблема — конкуренция за один mutex.

Основные подходы

Чаще всего применяются несколько стратегий.

1. Минимизация критической секции

Идея:

  1. Делать вне блокировки все, что возможно.

  2. Внутри mutex оставлять только запись.

Это снижает время удержания lock.

2. Шардирование

Подход:

  1. Данные делятся на несколько частей.

  2. У каждой части свой mutex.

Пример идеи:

// массив map + mutex по индексу
// выбор shard по hash ключа

Это уменьшает вероятность конфликтов.

3. Батчинг

Подход:

  1. Собирать данные в буфер.

  2. Записывать одной операцией.

Это уменьшает число блокировок.

4. Каналы и worker

Подход:

  1. Все записи идут в канал.

  2. Один worker выполняет запись.

Это полностью устраняет необходимость mutex для ресурса.

5. Atomic операции

Подходит для:

  1. Счетчиков.

  2. Простых флагов.

atomic.AddInt64(&counter, 1)

Когда что применять

Обычно:

  1. Высокая конкуренция — sharding.

  2. Последовательный ресурс (файл, сокет) — worker goroutine.

  3. Простые числа — atomic.

Вывод

Уменьшение блокировок достигается сокращением времени удержания mutex, разделением данных или передачей ответственности одной goroutine.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • Golang

    Golang

Ключевые слова

#lock

#contention

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.