Sobes.tech
Junior — Middle

Kas nutiks, jei keli gorutinai vienu metu bandys pasiekti tą patį raktą žemėlapyje?

sobes.tech AI

Atsakymas iš AI

Go kalboje, žemėlapis (map) nėra srauto saugi duomenų struktūra. Jei keli gorutinai vienu metu bando skaityti ir/arba rašyti į tą patį žemėlapį be sinchronizacijos, tai sukels lenktynių sąlygas ir tikėtina, kad paleidimo metu įvyks panika.

Norint to išvengti, būtina naudoti sinchronizacijos mechanizmus, pavyzdžiui:

  • sync.Mutex užrakinti prieigą prie žemėlapio.
  • sync.RWMutex atskirti skaitymo ir rašymo užraktus.
  • Specializuotos struktūros, pavyzdžiui, sync.Map, kurios yra saugios konkurenciniam prieigai.

Pavyzdys, kaip naudoti sync.Mutex žemėlapiui apsaugoti:

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

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

func read(key string) int {
    mu.Lock()
    defer mu.Unlock()
    return m[key]
}