Sobes.tech
Junior — Middle

Biztonságosan lehet-e olyan közös erőforrásokat, mint például a Map, használni több goroutine egyidejű hozzáférése esetén?

sobes.tech MI

Válasz az MI-től

Nem, a Go alapértelmezett térképe (map) nem szálbiztos, és nem használható egyszerre több goroutine-ból további szinkronizáció nélkül. A védtelen párhuzamos hozzáférés versenyhelyzeteket és pánikokat okozhat.

A közös erőforrások, például térképek biztonságos használatához több szálon futó környezetben:

  • Használjon sync.Mutex vagy sync.RWMutex a térkép hozzáférésének védelmére.
  • Használjon sync.Map-ot, amely egy specializált és szálbiztos adatstruktúra térképekhez.

Példa mutex-szel:

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 használata:

var m sync.Map

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