Sobes.tech
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.