Junior — Middle
Je možné zabezpečiť bezpečnosť pri súčasnom čítaní údajov z Map v prostredí s viacerými vláknami?
sobes.tech AI
Odpoveď od AI
V Go štandardná mapa (map) nie je bezpečná pre súčasný prístup. Ak niekoľko gorútín číta z mapy bez zápisu, je to bezpečné. Ak však aspoň jedna gorutina zapisuje do mapy, súčasné čítanie a zápis spôsobí paniku.
Pre bezpečné súčasné čítanie z mapy bez zápisu môžete použiť bežnú mapu bez synchronizácie. Ak je však možnosť zápisu, je potrebné použiť synchronizáciu, napríklad cez sync.RWMutex alebo sync.Map, ktorý je špeciálne navrhnutý pre konkurenčný prístup.
Príklad s sync.RWMutex pre bezpečné čítanie 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
}
// Čítanie
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Ak garantujete, že mapa sa po inicializácii nemení, potom je súčasné čítanie bezpečné bez ďalšej synchronizácie.