Sobes.tech
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
}

Այսպիսով՝ միաժամանակյա մուտք գործելիս քարտեզներին սխալների կանխարգելման համար անհրաժեշտ է օգտագործել սինխրոնիզացիա կամ հատուկ կառուցվածքներ։