Все темы
Тема 02

Синхронизация и sync

Разберись в теме, затем проверь понимание на задачах.

0/4 решено0%
К задачам

О чём этот блок

Каналы хороши, когда данные движутся от одной горутины к другой. Но счётчик запросов, кэш, флаг «инициализация выполнена» никуда не движутся: они лежат на месте, а к ним обращаются сотни горутин. Для такого общего состояния есть пакеты sync и sync/atomic.

Блок учит не только защищать данные, но и выбирать инструмент. Счётчик можно защитить мьютексом или атомиком, кэш — Mutex, RWMutex или неизменяемыми снимками через atomic.Value. Что быстрее, зависит от доли чтений, размера критической секции и числа ядер, поэтому выбор подтверждают бенчмарком, а не привычкой.

Что понадобится

  • sync.Mutex и правило «все обращения к общим данным — под одной блокировкой».
  • sync.RWMutex для нагрузки, где чтений намного больше, чем записей.
  • atomic.Int64 и разница между неделимой операцией и неделимой последовательностью операций.
  • sync.Once: ровно один запуск и общий результат для всех ожидающих.
  • sync.Cond и проверка условия в цикле.
  • Happens-before: почему без синхронизации запись одной горутины может быть не видна другой.

Задачи

Что прочитать

// Идиома блока: читатели не мешают друг другу, писатель — один.
func (c *Cache) Get(k string) (any, bool) {
    c.mu.RLock()
    defer c.mu.RUnlock()
    v, ok := c.m[k]
    return v, ok
}

Задачи темы 4