Sobes.tech
Junior — Middle

Είναι δυνατόν να διασφαλιστεί η ασφάλεια κατά την ανάγνωση δεδομένων από ένα Map σε ένα περιβάλλον πολλαπλών νημάτων;

sobes.tech AI

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

Στο Go, ο τυπικός χάρτης (map) δεν είναι ασφαλής για ταυτόχρονη πρόσβαση. Αν πολλαπρο goroutines διαβάζουν από το map χωρίς να γράφουν, αυτό είναι ασφαλές. Ωστόσο, αν τουλάχιστον μια goroutine γράφει στο map, η ταυτόχρονη ανάγνωση και εγγραφή θα προκαλέσει panic.

Για ασφαλή ταυτόχρονη ανάγνωση από το map χωρίς εγγραφή, μπορείτε να χρησιμοποιήσετε ένα κανονικό map χωρίς συγχρονισμό. Αλλά αν υπάρχει πιθανότητα εγγραφής, πρέπει να χρησιμοποιήσετε συγχρονισμό, π.χ. μέσω sync.RWMutex ή sync.Map, που έχει σχεδιαστεί ειδικά για ταυτόχρονη πρόσβαση.

Παράδειγμα με sync.RWMutex για ασφαλή ανάγνωση και εγγραφή:

var (
    m = make(map[string]int)
    mu sync.RWMutex
)

// Εγγραφή
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// Ανάγνωση
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

Αν εγγυάστε ότι το map δεν αλλάζει μετά την αρχικοποίηση, τότε η ταυτόχρονη ανάγνωση είναι ασφαλής χωρίς επιπλέον συγχρονισμό.