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-ը չի փոխվում հետո ինիցիալիզացիայից, ապա միաժամանակյա ընթերցումը անվտանգ է առանց լրացուցիչ սինխրոնիզացիայի։