Intern
Je čítanie máp v Go bezpečné?
sobes.tech AI
Odpoveď od AI
V jazyku Go nie je čítanie z map bezpečné pre vlákna, ak sa súčasne vykonáva zápis. Pre bezpečné čítanie v prostredí s viacerými vláknami je potrebné použiť synchronizáciu, napríklad sync.RWMutex na uzamknutie pri čítaní a zápise, alebo použiť sync.Map, ktorý je špeciálne navrhnutý pre konkurenčný prístup.
Príklad s sync.RWMutex:
import (
"sync"
)
var (
m = make(map[string]int)
mu sync.RWMutex
)
func read(key string) (int, bool) {
mu.RLock() // zamknutie na čítanie
defer mu.RUnlock() // odomknutie
val, ok := m[key]
return val, ok
}
func write(key string, val int) {
mu.Lock() // zamknutie na zápis
defer mu.Unlock() // odomknutie
m[key] = val
}
Ale použite sync.Map:
import "sync"
var m sync.Map
func read(key string) (interface{}, bool) {
return m.Load(key)
}
func write(key string, val interface{}) {
m.Store(key, val)
}
sync.Map je vhodný, keď je veľa konkurenčných operácií, ale má špecifické vlastnosti z hľadiska výkonu a API.