Sobes.tech
Junior — Middle

Ar įmanoma užtikrinti saugumą tuo pačiu metu skaitant duomenis iš Map daugiagyslėje aplinkoje?

sobes.tech AI

Atsakymas iš AI

Go standartinė kortelė (map) nėra saugi vienu metu prieinama. Jei keli gorutinai skaito iš map be rašymo, tai yra saugu. Tačiau, jei bent viena gorutina rašo į map, vienu metu skaitymas ir rašymas sukels paniką.

Saugiam vienu metu skaitymui iš map be rašymo, galima naudoti įprastą map be sinchronizacijos. Bet jei yra rašymo galimybė, reikia naudoti sinchronizaciją, pvz., sync.RWMutex arba sync.Map, kuris specialiai sukurtas konkurenciniam prieigai.

Pavyzdys su sync.RWMutex saugiam skaitymui ir rašymui:

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

// Rašymas
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// Skaitymas
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

Jei garantuojate, kad map po inicializacijos nepasikeis, tada vienu metu skaitymas yra saugus be papildomos sinchronizacijos.