Intern
Czy odczyt map w Go jest bezpieczny wątkowo?
sobes.tech AI
Odpowiedź od AI
W języku Go odczyt z map nie jest bezpieczny dla wątków, jeśli jednocześnie dochodzi do zapisu. Aby bezpiecznie odczytywać z map w środowisku wielowątkowym, należy użyć synchronizacji, na przykład sync.RWMutex do blokowania odczytu i zapisu, lub użyć sync.Map, który jest specjalnie zaprojektowany do dostępu współbieżnego.
Przykład z sync.RWMutex:
import (
"sync"
)
var (
m = make(map[string]int)
mu sync.RWMutex
)
func read(key string) (int, bool) {
mu.RLock() // blokada odczytu
defer mu.RUnlock() // odblokowanie
val, ok := m[key]
return val, ok
}
func write(key string, val int) {
mu.Lock() // blokada zapisu
defer mu.Unlock() // odblokowanie
m[key] = val
}
Lub użyć sync.Map:
import "sync"
var m sync.Map
func read(key string) (interface{}, bool) {
return m.Load(key)
}
func write(key string, val interface{}) {
m.Store(key, val)
}
sync.Map jest przydatny, gdy wykonuje się wiele operacji współbieżnych, ale ma specyficzne cechy pod względem wydajności i API.