Назад к вопросам
Senior
2
Какие проблемы с конкурентным доступом возникают при вызове методов Get и Set из разных горутин? Как их решить?
Компании, где спрашивали
Cloud.ru
Ответ от нейросети
sobes.tech 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
}
Такой подход гарантирует, что данные не будут повреждены при конкурентном доступе.