Как защитить map от конкурентной записи?

Middle+
1.1k просмотров
AFK Offer AI

Map в Go не потокобезопасна — конкурентная запись вызывает fatal error: concurrent map writes. Три способа защиты:

1. sync.Mutex:

var mu sync.Mutex
var m = make(map[string]int)

mu.Lock() m["key"] = 1 mu.Unlock()

2. sync.RWMutex — множество читателей, один писатель:

var mu sync.RWMutex
mu.RLock()   // для чтения
mu.RUnlock()
mu.Lock()    // для записи
mu.Unlock()

3. sync.Map — встроенная потокобезопасная map. Оптимальна при read-heavy нагрузке с непересекающимися ключами.

Для большинства случаев map + sync.RWMutex — лучший выбор по производительности и простоте.

Следующий вопрос

Как работает go test -race?