Sobes.tech
Middle — Middle+

Ako zabezpečiť bezpečnú prácu s kolekciou Map v viacvláknovom prostredí?

sobes.tech AI

Odpoveď od AI

V Go nie je štandardná mapa (mapa) bezpečná pre súčasné čítanie a zápis z rôznych gorutín. Aby ste zabezpečili bezpečnú prácu s mapou v prostredí s viacerými vláknami, môžete použiť nasledujúce prístupy:

  1. Synchronizácia pomocou mutexu

Použite sync.Mutex alebo sync.RWMutex na ochranu prístupu k mape. Pri zápise zamknite mutex na zápis, pri čítaní — na čítanie (ak používate 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. Použitie sync.Map

V Go existuje špeciálna štruktúra sync.Map, ktorá je optimalizovaná pre konkurenčný prístup a nevyžaduje manuálnu synchronizáciu.

import "sync"

var m sync.Map

// Zápis
m.Store("key", 42)

// Čítanie
val, ok := m.Load("key")
  1. Použitie kanálov (channels)

Prístup k mape môžete organizovať cez gorutinu, ktorá spracováva požiadavky na čítanie a zápis cez kanály, čím zabezpečuje sekvenčný prístup.

Výber metódy závisí od špecifických požiadaviek na výkon a zložitosti implementácie.