Sobes.tech
Middle

Welke soorten mutexes biedt de standaardbibliotheek van Go?

sobes.tech AI

Antwoord van AI

De standaardbibliotheek van Go biedt twee hoofdtypen mutexen in het sync-pakket:

  • sync.Mutex: Een basismutex die onderlinge uitsluiting garandeert. Het kan in twee toestanden zijn: geblokkeerd of ontgrendeld. Slechts één goroutine kan op een gegeven moment de lock vasthouden.
  • sync.RWMutex: Een mutex voor lezen/schrijven. Hiermee kunnen meerdere goroutines gelijktijdig lezen (door RLock), maar slechts één schrijven (door Lock). Schrijven blokkeert alle operaties (zowel lezen als schrijven).

Belangrijkste methoden van sync.Mutex:

Methode Beschrijving
Lock() Blokkeert de mutex. Als deze al geblokkeerd is, wordt de oproepende goroutine geblokkeerd tot deze wordt vrijgegeven.
Unlock() Ontgrendelt de mutex. Geeft een panic als de mutex niet was vergrendeld door de oproepende goroutine.

Belangrijkste methoden van sync.RWMutex:

Methode Beschrijving
Lock() Blokkeert de mutex voor schrijven. Blokkeert alle lees- en schrijfbewerkingen.
Unlock() Ontgrendelt de mutex voor schrijven. Geeft een panic als de mutex niet was vergrendeld voor schrijven.
RLock() Blokkeert de mutex voor lezen. Blokkeert andere leesbewerkingen niet. Wordt geblokkeerd als er een schrijflock is.
RUnlock() Ontgrendelt de mutex voor lezen. Geeft een panic als de mutex niet was vergrendeld voor lezen.
RLocker() Geeft een Locker die RLock en RUnlock gebruikt.

Voorbeeld van gebruik van sync.Mutex:

package main

import (
	"fmt"
	"sync"
	"time"
)

var counter int
var mutex sync.Mutex

func increment() {
	mutex.Lock() // Blokkeert de mutex
	counter++
	fmt.Printf("Counter: %d\n", counter)
	mutex.Unlock() // Ontgrendelt de mutex
}

func main() {
	for i := 0; i < 10; i++ {
		go increment()
	}
	time.Sleep(time.Second) // Geeft de goroutines de tijd om te voltooien
}

Voorbeeld van gebruik van sync.RWMutex:

package main

import (
	"fmt"
	"sync"
	"time"
)

var data string
var rwMutex sync.RWMutex

func readData() {
	rwMutex.RLock() // Blokkeert voor lezen
	fmt.Printf("Lezen van data: %s\n", data)
	rwMutex.RUnlock() // Ontgrendelt voor lezen
}

func writeData(newData string) {
	rwMutex.Lock() // Blokkeert voor schrijven
	data = newData
	fmt.Printf("Schrijven van data: %s\n", data)
	rwMutex.Unlock() // Ontgrendelt voor schrijven
}

func main() {
	go writeData("Hallo")
	time.Sleep(100 * time.Millisecond) // Geeft tijd voor schrijven

	for i := 0; i < 5; i++ {
		go readData() // Meerdere gelijktijdige lezingen zijn toegestaan
	}

	time.Sleep(time.Second) // Geeft tijd voor de goroutines
	go writeData("Wereld")
	time.Sleep(100 * time.Millisecond)
	go readData()

	time.Sleep(time.Second) // Wacht tot alles klaar is
}