Sobes.tech
Junior — Middle

Կարող է ապահովել անվտանգությունը միաժամանակ Map-ից տվյալներ ընթերցելիս բազմամյա միջավայրում?

sobes.tech AI

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

Go-ում ստանդարտ քարտը (map) չի ապահովված միաժամանակյա մուտքի համար: Եթե մի քանի goroutine-ներ ընթերցում են map-ից առանց գրելու, դա անվտանգ է: Սակայն, եթե առնվազն մեկ goroutine գրում է map-ին, միաժամանակյա ընթերցում և գրառում կհանգեցնի panic-ի:

Անվտանգ միաժամանակյա ընթերցման համար առանց գրելու, կարելի է օգտագործել սովորական map առանց սինխրոնիզացիայի: Բայց եթե գրելու հնարավորությունը կա, ապա պետք է օգտագործել սինխրոնիզացիա, օրինակ, sync.RWMutex կամ sync.Map, որը հատուկ նախագծված է մրցակցային մուտքի համար:

Օրինակ sync.RWMutex-ով անվտանգ ընթերցում և գրառում:

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

// Գրառում
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// Ընթերցում
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

Եթե դուք երաշխավորում եք, որ map-ը չի փոխվում հետո ինիցիալիզացիայից, ապա միաժամանակյա ընթերցումը անվտանգ է առանց լրացուցիչ սինխրոնիզացիայի։