Sobes.tech
Junior — Middle

Кадом чорабиниҳо барои пешгирии рух додани истиснои ConcurrentModificationException дар вақти тағир додани ҳамзамон объекти Map аз ҷониби чандирҳо гирифта мешаванд?

sobes.tech AI

Ҷавоб аз AI

Дар Go, харита (map) бехатар нест барои хондан ва навишт дар як вақт аз чанд горутин. Барои пешгирӣ кардани ConcurrentModificationException (муодили он дар Go паника аст дар вақти дастрасии ҳамзамон), тадбирҳои зерин истифода мешаванд:

  • Истифодаи mutex (sync.Mutex ё sync.RWMutex) барои ҳамоҳангсозии дастрасӣ ба харита.
  • Истифодаи структураҳои бехатар барои ҳамзамон, масалан, sync.Map, ки махсус барои дастрасии ҳамзамон тарҳрезӣ шудааст.

Масалан бо mutex:

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
}

Тавре ки мебинем, барои пешгирии хатоҳо дар дастрасии ҳамзамон ба харитаҳо, бояд истифодаи ҳамоҳангсозӣ ё структураҳои махсусро истифода барем.