Senior
Какви проблеми с конкурентния достъп възникват при извикване на методите Get и Set от различни горутини? Как да ги решим?
sobes.tech AI
Отговор от AI
Когато методите Get и Set се извикват едновременно от различни горутини, възниква проблем с гонка на данни (data race). Това се случва, защото няколко горутини могат едновременно да четат и променят споделени данни, което води до непредсказуемо поведение и грешки.
За решаване на този проблем в Go обикновено се използват:
- Мютекс (sync.Mutex) — блокира достъпа до данните по време на операцията, осигурявайки изключителен достъп.
- RWMutex (sync.RWMutex) — позволява на няколко горутини да четат данните едновременно, но блокира писането, ако някой пише.
- Канали (channels) — за организиране на последователен достъп до данните чрез предаване на съобщения.
Пример с RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // блокиране за четене
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // блокиране за писане
defer m.mu.Unlock()
m.data[key] = value
}
Този подход гарантира, че данните няма да бъдат повредени при конкурентен достъп.