Sobes.tech
Junior — Middle

რა ზომები მიიღება ერთდროულად რამდენიმე ნაკადიდან Map ობიექტის შეცვლის დროს გამონაკლისი ConcurrentModificationException-ის წარმოქმნის თავიდან ასაცილებლად?

sobes.tech AI

პასუხი AI-სგან

Go-да, რუკა (map) უსაფრთხო არაა ერთდროულად წაკითხვასა და დაწერას რამდენიმე გორუტინიდან. რათა თავიდან აიცილოს ConcurrentModificationException (ანალოგი Go-ში — პანიკა ერთდროულ წვდომაზე), გამოიყენება შემდეგი ზომები:

  • mutex-ის (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
}

ამ გზით, ერთდროულად რუკაზე წვდომის დროს შეცდომების თავიდან აცილებისთვის, საჭიროა სინქრონიზაცია ან სპეციალიზებული სტრუქტურების გამოყენება.