Sobes.tech
Back to questions
Senior
1

Какие проблемы с конкурентным доступом возникают при вызове методов Get и Set из разных горутин? Как их решить?

Companies where asked
Cloud.ru

Answer from AI

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
}

Такой подход гарантирует, что данные не будут повреждены при конкурентном доступе.