Junior — Middle
Τι συμβαίνει αν πολλές goroutines προσπαθούν ταυτόχρονα να αποκτήσουν πρόσβαση σε ένα ίδιο κλειδί σε έναν χάρτη;
sobes.tech AI
Απάντηση από AI
Στη Go, ένας χάρτης (map) δεν είναι μια δομή δεδομένων ασφαλής για ταυτόχρονη πρόσβαση. Αν πολλαπρα goroutines προσπαθούν ταυτόχρονα να διαβάσουν και/ή να γράψουν στον ίδιο χάρτη χωρίς συγχρονισμό, αυτό θα οδηγήσει σε συνθήκες αγώνα και πιθανώς σε panic κατά την εκτέλεση.
Για να το αποφύγετε, είναι απαραίτητο να χρησιμοποιήσετε μηχανισμούς συγχρονισμού, όπως:
sync.Mutexγια το κλείδωμα της πρόσβασης στον χάρτη.sync.RWMutexγια διαχωρισμό των κλειδώσεων ανάγνωσης και εγγραφής.- Εξειδικευμένες δομές, όπως το
sync.Map, που είναι ασφαλείς για ταυτόχρονη πρόσβαση.
Παράδειγμα χρήσης του sync.Mutex για την προστασία του χάρτη:
var mu sync.Mutex
var m = make(map[string]int)
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
func read(key string) int {
mu.Lock()
defer mu.Unlock()
return m[key]
}