Sobes.tech
Junior — Middle

Welke maatregelen worden genomen om het optreden van de uitzondering ConcurrentModificationException te voorkomen bij gelijktijdige modificatie van een Map-object door meerdere threads?

sobes.tech AI

Antwoord van AI

In Go is een map (map) niet thread-safe voor gelijktijdig lezen en schrijven vanuit meerdere goroutines. Om ConcurrentModificationException (het equivalent in Go is een panic bij gelijktijdige toegang) te voorkomen, worden de volgende maatregelen genomen:

  • Gebruik van mutex (sync.Mutex of sync.RWMutex) om toegang tot de map te synchroniseren.
  • Gebruik van thread-safe datastructuren, bijvoorbeeld sync.Map, die speciaal is ontworpen voor gelijktijdige toegang.

Voorbeeld met 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
}

Gebruik van 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
}

Op deze manier moet je synchronisatie of gespecialiseerde structuren gebruiken om fouten bij gelijktijdige toegang tot maps te voorkomen.