Junior — Middle
Czy można zapewnić bezpieczeństwo podczas jednoczesnego odczytu danych z Map w środowisku wielowątkowym?
sobes.tech AI
Odpowiedź od AI
W Go, standardowa mapa (map) nie jest bezpieczna dla dostępu współbieżnego. Jeśli kilka goroutine odczytuje z mapy bez zapisu, jest to bezpieczne. Jednak jeśli przynajmniej jedna goroutine zapisuje do mapy, równoczesne odczyty i zapisy spowodują panic.
Aby bezpiecznie odczytywać z mapy bez zapisu, można użyć zwykłej mapy bez synchronizacji. Jeśli jednak istnieje możliwość zapisu, należy użyć synchronizacji, np. przez sync.RWMutex lub sync.Map, który jest specjalnie zaprojektowany do dostępu współbieżnego.
Przykład z sync.RWMutex dla bezpiecznego odczytu i zapisu:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// Zapis
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// Odczyt
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
Jeśli gwarantujesz, że mapa nie będzie się zmieniać po inicjalizacji, równoczesny odczyt jest bezpieczny bez dodatkowej synchronizacji.