Sobes.tech
Senior

Ce probleme de acces concurent apar atunci când apelăm metodele Get și Set din gorutine diferite? Cum le rezolvăm?

sobes.tech AI

Răspuns de la 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
}

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