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:
- 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
}
- 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")
- 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.