Middle+
Картанын эсинде атаандаштык жазуу учурунда каталардан кантип коргоо керек?
sobes.tech AI
AIден жооп
Гонку коргоо үчүн map ичинде Golangда, ал алдын ала ишенимдүү эмес, төмөнкү механизмдер колдонулат:
-
sync.Mutex: жазуу алдында mapти жабуу жана жазуудан кийин ачуу.import "sync" type SafeMap struct { mu sync.Mutex data map[string]int } func NewSafeMap() *SafeMap { return &SafeMap{ data: make(map[string]int), } } func (sm *SafeMap) Set(key string, value int) { sm.mu.Lock() defer sm.mu.Unlock() sm.data[key] = value } func (sm *SafeMap) Get(key string) (int, bool) { sm.mu.Lock() defer sm.mu.Unlock() val, ok := sm.data[key] return val, ok } -
sync.RWMutex: бир нече горутиналар mapтен бир убакта окуй алат, бирок жазуу учурда блоктолот.import "sync" type SafeMapRWMutex struct { mu sync.RWMutex data map[string]int } func NewSafeMapRWMutex() *SafeMapRWMutex { return &SafeMapRWMutex{ data: make(map[string]int), } } func (sm *SafeMapRWMutex) Set(key string, value int) { sm.mu.Lock() // Жазуу үчүн блоктоо defer sm.mu.Unlock() sm.data[key] = value } func (sm *SafeMapRWMutex) Get(key string) (int, bool) { sm.mu.RLock() // Окуу үчүн блоктоо defer sm.mu.RUnlock() val, ok := sm.data[key] return val, ok } -
sync.Map: Специализированный тип, безопасный для потоков, оптимизированный для сценариев, где набор ключей относительно стабилен, записи редки, или когда несколько горутин читают и пишут для дизъюнктивных наборов ключей.import "sync" var safeMap sync.Map // Декларация func UseSyncMap() { safeMap.Store("key1", 10) // Запись if val, ok := safeMap.Load("key1"); ok { // Чтение // Используйте val } safeMap.Delete("key1") // Удаление }
Жоопторду салыштыруу:
| Механизм | Артыкчылыктары | Кемчиликтери | Колдонуу |
|---|---|---|---|
sync.Mutex |
Жөнөкөй колдонуу | Бардык операцияларды блоктойт жазуу учурунда | Жөнөкөй сценарийлер, конкуренция жогорку эмес же окуу/жазуу дээрлик бирдей. |
sync.RWMutex |
Көптөгөн горутиналардан бир убакта окууга мүмкүндүк берет | sync.Mutexке караганда татаал. Жазуу окууну жана башка жазууларды блоктойт |
Жыш окуу жана сейрек жазуу сценарийлери. |
sync.Map |
Айрым сценарийлер үчүн оптималдаштырылган | API чектелүү. Эгер жетүү толугу менен кездейсөз болсо, Mutexке караганда жайыраак болушу мүмкүн. |
Көпчүлүк учурда туруктуу ачкычтар же дисжунктивдүү ачкыч топтомдору менен жетүү сценарийлери. |
Туура механизм тандоо жетүү характерине көз каранды. Жалпысынан, sync.Mutex же sync.RWMutex жетиштүү. Спецификалык сценарийлер үчүн sync.Map жакшы натыйжа бере алат.