Не держи мьютекс во время долгого вычисления. Реализуйте LoadOrStore(key string, compute func() int) int: под мьютексом только проверка map и вставка, compute — без блокировки.
- Задача
- Решение
- Обсуждение
LoadOrStore: вычисление вне мьютекса
GolangРешение
func (s *Store) LoadOrStore(key string, compute func() int) int {
s.mu.Lock()
if v, ok := s.m[key]; ok {
s.mu.Unlock()
return v
}
s.mu.Unlock()
v := compute()
s.mu.Lock()
s.m[key] = v
s.mu.Unlock()
return v
}