Sobes.tech
Junior — Middle

Πώς διασφαλίζετε την ασφάλεια κατά τη χρήση του Map σε ένα πολυνηματικό περιβάλλον;

sobes.tech AI

Απάντηση από AI

Στην Go, ο προεπιλεγμένος χάρτης (map) δεν είναι ασφαλής για ταυτόχρονη ανάγνωση και εγγραφή από διαφορετικές goroutines. Για να διασφαλίσετε την ασφάλεια κατά τη χρήση χαρτών σε περιβάλλοντα πολλαπλών νημάτων, μπορείτε να χρησιμοποιήσετε:

  1. Μηχανισμούς κλειδώματος (sync.Mutex ή sync.RWMutex) — μπλοκάρουν την πρόσβαση στον χάρτη κατά την ανάγνωση/εγγραφή.
var (
    m = make(map[string]int)
    mu sync.RWMutex
)

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
}
  1. sync.Map — εξειδικευμένη δομή ασφαλής για νήματα από τη βιβλιοθήκη standard, βελτιστοποιημένη για περιπτώσεις με πολλά goroutines.
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
}

Η επιλογή εξαρτάται από την συγκεκριμένη εργασία: αν χρειάζονται πολλές λειτουργίες εγγραφής και ανάγνωσης, είναι καλύτερο να χρησιμοποιούνται μηχανισμοί κλειδώματος; αν οι λειτουργίες είναι κυρίως ανάγνωσης, το sync.Map μπορεί να είναι πιο αποδοτικό.