Sobes.tech
Middle — Middle+

W jaki sposób można zapewnić bezpieczną pracę z kolekcją Map w środowisku wielowątkowym?

sobes.tech AI

Odpowiedź od AI

W Go, standardowa mapa (mapa) nie jest bezpieczna dla współbieżnego odczytu i zapisu z różnych gorutyn. Aby zapewnić bezpieczną pracę z mapą w środowisku wielowątkowym, można użyć następujących podejść:

  1. Synchronizacja za pomocą mutexa

Użyj sync.Mutex lub sync.RWMutex do ochrony dostępu do mapy. Podczas zapisu blokuj mutex do zapisu, a podczas odczytu — do odczytu (jeśli używasz RWMutex).

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. Użycie sync.Map

W Go istnieje specjalna struktura sync.Map, zoptymalizowana pod kątem dostępu współbieżnego i nie wymaga ręcznej synchronizacji.

import "sync"

var m sync.Map

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

// Odczyt
val, ok := m.Load("key")
  1. Użycie kanałów (channels)

Możesz zorganizować dostęp do mapy przez goroutine, która obsługuje żądania odczytu i zapisu za pomocą kanałów, zapewniając dostęp sekwencyjny.

Wybór metody zależy od konkretnych wymagań dotyczących wydajności i złożoności implementacji.