Junior — Middle
Ինչ միջոցներ են ձեռնարկվում՝ կանխելու համար ConcurrentModificationException արտահայտության առաջացումը միաժամանակյա փոփոխության ժամանակ մի քանի հոսքերից Map օբյեկտի վրա։
sobes.tech AI
Պատասխան AI-ից
Go-ում քարտեզը (map) անվտանգ չէ միաժամանակյա ընթերցման և գրելու համար մի քանի goroutines-ներից։ Թեև ConcurrentModificationException-ը (որը Go-ում համարժեք է պանիկին՝ երբ միաժամանակյա մուտք է կատարվում), կանխելու համար կիրառվում են հետևյալ միջոցառումները՝
- Օգտագործել մյուտեքս (
sync.Mutexկամsync.RWMutex) քարտեզի մուտքի սինխրոնիզացման համար։ - Օգտագործել միաժամանակյա անվտանգ տվյալների կառուցվածքներ, օրինակ՝
sync.Map, որը հատուկ նախագծված է մրցակցային մուտքի համար։
Միջնորդական մյուտեքսով օրինակ՝
var mu sync.RWMutex
var m = make(map[string]int)
func read(key string) int {
mu.RLock()
defer mu.RUnlock()
return m[key]
}
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
sync.Map-ի օգտագործում՝
var m sync.Map
func write(key string, value int) {
m.Store(key, value)
}
func read(key string) (int, bool) {
val, ok := m.Load(key)
if !ok {
return 0, false
}
return val.(int), true
}
Այսպիսով՝ միաժամանակյա մուտք գործելիս քարտեզներին սխալների կանխարգելման համար անհրաժեշտ է օգտագործել սինխրոնիզացիա կամ հատուկ կառուցվածքներ։