Come garantire un lavoro sicuro con la collezione Map in un ambiente multithread?
sobes.tech AI
Risposta dell'AI
In Go, la mappa standard (map) non è sicura per l'accesso concorrente in lettura e scrittura da diverse goroutine. Per garantire un uso sicuro della mappa in un ambiente multithread, si possono usare i seguenti approcci:
- Sincronizzazione con mutex
Utilizzare sync.Mutex o sync.RWMutex per proteggere l'accesso alla mappa. Durante la scrittura, bloccare il mutex per la scrittura, e durante la lettura — per la lettura (se si usa RWMutex).
import "sync"
type SafeMap struct {
mu sync.RWMutex
m map[string]int
}
func (s *SafeMap) Get(key string) (int, bool) {
s.mu.RLock()
defer s.mu.RUnlock()
val, ok := s.m[key]
return val, ok
}
func (s *SafeMap) Set(key string, val int) {
s.mu.Lock()
defer s.mu.Unlock()
s.m[key] = val
}
- Utilizzo di sync.Map
In Go, esiste una struttura specializzata sync.Map, ottimizzata per accesso concorrente e che non richiede sincronizzazione manuale.
import "sync"
var m sync.Map
// Scrittura
m.Store("key", 42)
// Lettura
val, ok := m.Load("key")
- Utilizzo di canali (channels)
Si può organizzare l'accesso alla mappa tramite una goroutine che gestisce le richieste di lettura e scrittura tramite canali, garantendo un accesso sequenziale.
La scelta del metodo dipende dai requisiti specifici di prestazioni e complessità di implementazione.