Sobes.tech
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.