Sobes.tech
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]
}