Junior — Middle
Quali misure vengono adottate per prevenire l'insorgenza dell'eccezione ConcurrentModificationException durante la modifica simultanea di un oggetto Map da parte di più thread?
sobes.tech AI
Risposta dell'AI
In Go, una mappa (map) non è sicura per l'accesso concorrente per lettura e scrittura simultanea da più goroutine. Per evitare ConcurrentModificationException (l'equivalente in Go è un panic durante l'accesso simultaneo), si adottano le seguenti misure:
- Uso di mutex (
sync.Mutexosync.RWMutex) per sincronizzare l'accesso alla mappa. - Uso di strutture dati sicure per la concorrenza, ad esempio,
sync.Map, progettata appositamente per l'accesso concorrente.
Esempio con 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
}
Utilizzo di 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
}
In questo modo, per prevenire errori durante l'accesso concorrente alla mappa, bisogna usare sincronizzazione o strutture specializzate.