Junior — Middle
შესაძლებელია თუ არა უსაფრთხოების უზრუნველყოფა ერთდროულად Map-დან მონაცემების წაკითხვას მრავალმხრივ გარემოში?
sobes.tech AI
პასუხი AI-სგან
Go-ში სტანდარტული რუკა (map) არ არის უსაფრთხო ერთდროული წვდომისთვის. თუ რამდენიმე goroutine წაიკითხავს map-დან წერილის გარეშე, ეს უსაფრთხოა. თუმცა, თუ მინიმუმ ერთი goroutine წერს map-ში, ერთდროული კითხვა და წერა გამოიწვევს პანიკას.
უსაფრთხო ერთდროული წაკითხვა map-დან წერილის გარეშე, შეიძლება გამოიყენოთ ჩვეულებრივი map გარეშე სინქრონიზაციის. მაგრამ თუ არსებობს წერის შესაძლებლობა, საჭიროა სინქრონიზაციის გამოყენება, მაგალითად, sync.RWMutex ან sync.Map, რომელიც სპეციალურად შექმნილია კონკურენტული წვდომისთვის.
მაგალითი sync.RWMutex-თან უსაფრთხო წაკითხვა და წერა:
var (
m = make(map[string]int)
mu sync.RWMutex
)
// წერა
func write(key string, value int) {
mu.Lock()
defer mu.Unlock()
m[key] = value
}
// წაკითხვა
func read(key string) (int, bool) {
mu.RLock()
defer mu.RUnlock()
val, ok := m[key]
return val, ok
}
თუ გარანტიას იძლევით, რომ map-ი არ იცვლება ინიციალიზაციის შემდეგ, მაშინ ერთდროული წაკითხვა უსაფრთხოა დამატებითი სინქრონიზაციის გარეშე.