Sobes.tech
Junior — Middle

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

sobes.tech AI

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

Στη Go, για την εξασφάλιση της ασφάλειας των νημάτων του αντικειμένου map, μπορεί να χρησιμοποιηθεί ένα mutex (sync.Mutex). Δεδομένου ότι το τυπικό map δεν είναι ασφαλές για πρόσβαση από πολλαπλά νήματα, πρέπει να προστατεύονται οι λειτουργίες ανάγνωσης και εγγραφής με κλείδωμα.

Παράδειγμα:

import (
    "sync"
)

type SafeMap struct {
    mu sync.Mutex
    m  map[string]int
}

func NewSafeMap() *SafeMap {
    return &SafeMap{
        m: make(map[string]int),
    }
}

func (s *SafeMap) Get(key string) (int, bool) {
    s.mu.Lock()
    defer s.mu.Unlock()
    val, ok := s.m[key]
    return val, ok
}

func (s *SafeMap) Set(key string, value int) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.m[key] = value
}

func (s *SafeMap) Delete(key string) {
    s.mu.Lock()
    defer s.mu.Unlock()
    delete(s.m, key)
}

Με αυτόν τον τρόπο, πριν από κάθε λειτουργία με το map, κλειδώνει το mutex, αποτρέποντας ταυτόχρονες προσβάσεις από πολλαπλά goroutines και αποφεύγοντας καταστάσεις αγώνα.