Junior — Middle
Ποια μέτρα λαμβάνονται για την αποτροπή εμφάνισης της εξαίρεσης ConcurrentModificationException κατά την ταυτόχρονη τροποποίηση ενός αντικειμένου Map από πολλαπλά νήματα;
sobes.tech AI
Απάντηση από AI
Στο Go, ένας χάρτης (map) δεν είναι ασφαλής για ταυτόχρονη ανάγνωση και εγγραφή από πολλαπρα goroutines. Για να αποφευχθεί το ConcurrentModificationException (το αντίστοιχο στο Go είναι ένα panic κατά την ταυτόχρονη πρόσβαση), εφαρμόζονται τα εξής μέτρα:
- Χρήση 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
}
Έτσι, για να αποτρέψετε σφάλματα κατά την ταυτόχρονη πρόσβαση σε χάρτες, πρέπει να χρησιμοποιείτε συγχρονισμό ή εξειδικευμένες δομές.