Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: sync.RWMutex, concurrent map, goroutine safety, mutex, Go synchronization

Как защитить общую map от конкурентного доступа при одновременном чтении/записи из разных горутин?

Вопрос проверяет понимание механизмов синхронизации доступа к разделяемым данным в Go, что необходимо для написания безопасных конкурентных программ.

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

Для защиты map от конкурентного доступа используйте sync.RWMutex. Он позволяет множеству горутин одновременно читать данные, но блокирует чтение при записи. Вызывайте RLock()/RUnlock() для чтения и Lock()/Unlock() для записи. Это эффективнее обычного Mutex, так как не блокирует читателей.

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

Проблема конкурентного доступа к map

В Go встроенная map не является потокобезопасной. Если несколько горутин одновременно читают и пишут в одну map без синхронизации, возникает race condition, приводящий к панике или некорректным данным. Для решения этой проблемы используются примитивы синхронизации.

Решение с sync.RWMutex

sync.RWMutex — это блокировка с разделением на чтение и запись. Она позволяет множеству горутин одновременно удерживать блокировку на чтение (RLock), но только одной — на запись (Lock). Это оптимально для сценариев, где чтений значительно больше, чем записей.

import "sync"

type SafeMap struct {
    mu   sync.RWMutex
    data map[string]int
}

func (sm *SafeMap) Read(key string) (int, bool) {
    sm.mu.RLock()
    defer sm.mu.RUnlock()
    val, ok := sm.data[key]
    return val, ok
}

func (sm *SafeMap) Write(key string, value int) {
    sm.mu.Lock()
    defer sm.mu.Unlock()
    sm.data[key] = value
}

Альтернативы

  • sync.Mutex — простая блокировка, блокирует всех, даже читателей. Менее эффективна при высокой нагрузке на чтение.
  • sync.Map — оптимизированная конкурентная map из стандартной библиотеки, подходит для специфических сценариев (частые чтения/записи с одного ключа, кэширование).

Вывод

Используйте sync.RWMutex для защиты map, когда чтения преобладают над записями. Для простых случаев или когда нужна максимальная производительность в специфических паттернах доступа, рассмотрите sync.Map.

  • Аватар

    Golang Guru

    Maxim Lukyanov

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

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Golang

    Golang

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

#sync.RWMutex

#concurrent map

#goroutine safety

#mutex

#Go synchronization

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

  • Аватар

    Golang Guru

    Maxim Lukyanov

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