Junior — Middle
Je možné zajistit bezpečnost při současném čtení dat z Map v prostředí s více vlákny?
sobes.tech AI
Odpověď od AI
V Go standardní mapě (mapa) není bezpečná pro současný přístup. Pokud několik gorutin čte z mapy bez zápisu, je to bezpečné. Pokud však alespoň jedna gorutina zapisuje do mapy, současné čtení a zápis způsobí paniku.
Pro bezpečné současné čtení z mapy bez zápisu lze použít běžnou mapu bez synchronizace. Pokud je však možnost zápisu, je třeba použít synchronizaci, například přes sync.RWMutex nebo sync.Map, který je speciálně navržen pro konkurenční přístup.
Příklad s sync.RWMutex pro bezpečné čtení a zápis:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Zápis
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Čtení
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Pokud garantujete, že mapa se po inicializaci nemění, je současné čtení bezpečné bez další synchronizace.