Sobes.tech
Middle — Middle+

Hoe kun je veilig werken met de Map-collectie in een multithread-omgeving?

sobes.tech AI

Antwoord van AI

In Go is de standaardkaart (map) niet thread-safe voor gelijktijdig lezen en schrijven vanuit verschillende goroutines. Om een veilige werking van de map in een multithread-omgeving te garanderen, kunnen de volgende benaderingen worden gebruikt:

  1. Synchronisatie met mutex

Gebruik sync.Mutex of sync.RWMutex om toegang tot de map te beschermen. Bij schrijven blokkeer je de mutex voor schrijven, en bij lezen — voor lezen (als je RWMutex gebruikt).

import "sync"

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

func (s *SafeMap) Get(key string) (int, bool) {
    s.mu.RLock()
    defer s.mu.RUnlock()
    val, ok := s.m[key]
    return val, ok
}

func (s *SafeMap) Set(key string, val int) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.m[key] = val
}
  1. Gebruik van sync.Map

In Go is er een gespecialiseerde structuur sync.Map, geoptimaliseerd voor gelijktijdige toegang en vereist geen handmatige synchronisatie.

import "sync"

var m sync.Map

// Schrijven
m.Store("key", 42)

// Lezen
val, ok := m.Load("key")
  1. Gebruik van kanalen (channels)

Je kunt toegang tot de map organiseren via een goroutine die verzoeken voor lezen en schrijven afhandelt via kanalen, waardoor sequentiële toegang wordt gegarandeerd.

De keuze van de methode hangt af van de specifieke prestatie-eisen en implementatiecomplexiteit.