Senior
Quali problemi di accesso concorrente si verificano chiamando i metodi Get e Set da diverse goroutine? Come risolverli?
sobes.tech AI
Risposta dell'AI
Quando si chiamano contemporaneamente i metodi Get e Set da diverse goroutine, si verifica un problema di race condition (data race). Questo accade perché più goroutine possono leggere e modificare dati condivisi contemporaneamente, portando a comportamenti imprevedibili ed errori.
Per risolvere questo problema in Go, si usano generalmente:
- Mutex (sync.Mutex) — blocca l'accesso ai dati durante l'operazione, garantendo un accesso esclusivo.
- RWMutex (sync.RWMutex) — permette a più goroutine di leggere i dati contemporaneamente, ma blocca la scrittura se qualcuno sta scrivendo.
- Canali (channels) — per organizzare l'accesso sequenziale ai dati tramite l'invio di messaggi.
Esempio con RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // blocco in lettura
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // blocco in scrittura
defer m.mu.Unlock()
m.data[key] = value
}
Questo metodo garantisce che i dati non vengano danneggiati durante l'accesso concorrente.