Sobes.tech
Back to questions
Junior — Middle
87

Можно ли безопасно использовать общие ресурсы типа Map при одновременном доступе из нескольких горутин?

Companies where asked
HyperRus

Answer from AI

sobes.tech AI

Нет, стандартная карта (map) в Go не является потокобезопасной и не может использоваться одновременно из нескольких горутин без дополнительной синхронизации. При одновременном доступе без защиты может возникнуть гонка данных и паника.

Для безопасного использования общих ресурсов типа map в многопоточной среде можно:

  • Использовать sync.Mutex или sync.RWMutex для защиты доступа к map.
  • Применять sync.Map — специализированную потокобезопасную структуру данных для карт.

Пример с mutex:

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

func write(key string, value int) {
    mu.Lock()
    m[key] = value
    mu.Unlock()
}

func read(key string) int {
    mu.Lock()
    defer mu.Unlock()
    return m[key]
}

Использование sync.Map:

var m sync.Map

m.Store("key", 42)
value, ok := m.Load("key")