Senior
Welke problemen met gelijktijdige toegang ontstaan er bij het aanroepen van de methoden Get en Set vanuit verschillende goroutines? Hoe los je ze op?
sobes.tech AI
Antwoord van AI
Wanneer de methoden Get en Set gelijktijdig worden aangeroepen vanuit verschillende goroutines, ontstaat een probleem met data race. Dit gebeurt omdat meerdere goroutines tegelijkertijd gedeelde gegevens kunnen lezen en wijzigen, wat leidt tot onvoorspelbaar gedrag en fouten.
Om dit probleem in Go op te lossen, worden meestal gebruikt:
- Mutex (sync.Mutex) — blokkeert de toegang tot de gegevens tijdens de operatie, waardoor exclusieve toegang wordt gegarandeerd.
- RWMutex (sync.RWMutex) — staat meerdere goroutines toe om gelijktijdig te lezen, maar blokkeert schrijven als iemand aan het schrijven is.
- Kanalen (channels) — organiseren sequentiële toegang tot gegevens via berichtoverdracht.
Voorbeeld met RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // leesslot
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // schrijfslot
defer m.mu.Unlock()
m.data[key] = value
}
Deze aanpak zorgt ervoor dat gegevens niet worden beschadigd tijdens gelijktijdige toegang.