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