Sobes.tech
Middle

Welke mutexes gebruik je om de veiligheid te waarborgen bij het werken met kaarten in Go?

sobes.tech AI

Antwoord van AI

Om de veiligheid te waarborgen bij het werken met niet-concurrente toegang tot datastructuren, inclusief kaarten (map), worden mutexen uit de sync-package in Go gebruikt.

  • sync.Mutex: Basismutex voor onderlinge uitsluiting. Wordt gebruikt om codeblokken te blokkeren en te ontgrendelen waar lezen of schrijven op een kaart plaatsvindt.
  • sync.RWMutex: Mutex met gedeelde (lezen) en exclusieve (schrijven) toegang. Hiermee kunnen meerdere goroutines tegelijkertijd lezen uit de kaart, maar slechts één schrijven. Ideaal voor scenario's waarin lezen veel vaker voorkomt dan schrijven.

De voorkeursoptie voor gelijktijdig en veilig werken met kaarten is sync.RWMutex, omdat het betere prestaties biedt bij meerdere gelijktijdige leesbewerkingen.

Voorbeeld van gebruik van sync.RWMutex:

import (
	"sync"
)

type SafeMap struct {
	mu sync.RWMutex
	m  map[string]int
}

func NewSafeMap() *SafeMap {
	return &SafeMap{
		m: make(map[string]int),
	}
}

func (sm *SafeMap) Set(key string, value int) {
	sm.mu.Lock()   // Blokkeren voor schrijven
	defer sm.mu.Unlock()
	sm.m[key] = value
}

func (sm *SafeMap) Get(key string) (int, bool) {
	sm.mu.RLock()  // Blokkeren voor lezen
	defer sm.mu.RUnlock()
	value, ok := sm.m[key]
	return value, ok
}

Er bestaat ook een gespecialiseerde sync.Map, die geoptimaliseerd is voor gebruik in gelijktijdige omgevingen zonder expliciete mutex-locks in de meeste gevallen, maar met bepaalde beperkingen en een andere API. Als er echter meer flexibele controle over de blokkades of specifieke toegangsscenario's nodig is, is het gebruik van sync.RWMutex over een standaard map een gangbare praktijk.