Sobes.tech
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
}

Този подход гарантира, че данните няма да бъдат повредени при конкурентен достъп.