Sobes.tech
Junior — Middle

Ի՞նչ կլինի, եթե միաժամանակ մի քանի գորուտիներ փորձեն մուտք գործել նույն բանալիին քարտում։

sobes.tech AI

Պատասխան AI-ից

Go լեզվում, քարտեզը (map) չի հանդիսանում հոսքային անվտանգ տվյալների կառուցվածք: Եթե մի քանի գորուտիններ միաժամանակ փորձում են կարդալ և/կամ գրել նույն քարտեզում առանց սինխրոնիզացիայի, դա կհանգեցնի մրցակցային պայմանների և հնարավոր է՝ գործարկման ժամանակ Panic:

Դրա կանխարգելման համար անհրաժեշտ է օգտագործել սինխրոնիզացիայի մեխանիզմներ, օրինակ՝

  • sync.Mutex՝ քարտեզի մուտքի փակելու համար:
  • sync.RWMutex՝ ընթերցման և գրելու համար փակողներ բաժանելու համար:
  • Մասնագիտացված կառուցվածքներ, օրինակ՝ sync.Map, որոնք անվտանգ են մրցակցային մուտքի համար:

Օրինակ՝ sync.Mutex օգտագործելով քարտեզը պաշտպանելու համար:

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]
}