Junior — Middle
Արդյոք անվտանգ է օգտագործել ընդհանուր ռեսուրսներ, ինչպիսիք են Map-ը, միաժամանակ մի քանի goroutine-ներից օգտվելիս?
sobes.tech AI
Պատասխան AI-ից
Ոչ, Go-ի ստանդարտ քարտեզը (map) չի ապահովում թրեդ-բանաձևություն և չի կարող միաժամանակ օգտագործվել մի քանի գորուտիներից առանց լրացուցիչ սինխրոնիզացիայի: Անվտանգ մուտքը կարող է առաջացնել մրցակցության պայմաններ և панիկ:
Անվտանգ օգտագործման համար ընդհանուր ռեսուրսների, ինչպիսիք են քարտեզները, բազմատրեդ միջավայրում, կարող եք:
- Օգտագործել sync.Mutex կամ sync.RWMutex՝ մուտքի պաշտպանելու համար:
- Օգտագործել sync.Map՝ հատուկ և թրեդ-անվտանգ տվյալների կառուցվածք քարտեզների համար:
mutex-ով օրինակ:
var mu sync.Mutex
var m = make(map[string]int)
func write(key string, value int) {
mu.Lock()
m[key] = value
mu.Unlock()
}
func read(key string) int {
mu.Lock()
defer mu.Unlock()
return m[key]
}
sync.Map-ի օգտագործում:
var m sync.Map
m.Store("key", 42)
value, ok := m.Load("key")