Sobes.tech
Junior — Middle

Co się stanie, jeśli kilka goroutine jednocześnie spróbuje uzyskać dostęp do tego samego klucza w mapie?

sobes.tech AI

Odpowiedź od AI

W Go, mapa (mapa) nie jest strukturą danych bezpieczną dla operacji współbieżnych. Jeśli kilka gorutyn jednocześnie próbowało będzie czytać i/lub pisać do tego samego mapy bez synchronizacji, spowoduje to warunki wyścigu i prawdopodobnie panikę podczas działania.

Aby tego uniknąć, konieczne jest użycie mechanizmów synchronizacji, na przykład:

  • sync.Mutex do blokowania dostępu do mapy.
  • sync.RWMutex do rozdzielenia blokad na odczyt i zapis.
  • Specjalistyczne struktury, takie jak sync.Map, które są bezpieczne dla dostępu współbieżnego.

Przykład użycia sync.Mutex do ochrony mapy:

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

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

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