Senior
Jakie problemy z dostępem współbieżnym występują podczas wywoływania metod Get i Set z różnych gorutyn? Jak je rozwiązać?
sobes.tech AI
Odpowiedź od AI
Gdy wywołujesz jednocześnie metody Get i Set z różnych gorutyn, pojawia się problem wyścigu danych (data race). Dzieje się tak, ponieważ wiele gorutyn może jednocześnie odczytywać i modyfikować wspólne dane, co prowadzi do nieprzewidywalnego zachowania i błędów.
Aby rozwiązać ten problem w Go, zazwyczaj używa się:
- Mutex (sync.Mutex) — blokuje dostęp do danych na czas operacji, zapewniając wyłączny dostęp.
- RWMutex (sync.RWMutex) — pozwala wielu gorutynom jednocześnie odczytywać dane, ale blokuje zapis, jeśli ktoś inny zapisuje.
- Kanały (channels) — do organizacji sekwencyjnego dostępu do danych poprzez przesyłanie wiadomości.
Przykład z użyciem RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // blokada odczytu
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // blokada zapisu
defer m.mu.Unlock()
m.data[key] = value
}
Ten podejście gwarantuje, że dane nie zostaną uszkodzone podczas dostępu współbieżnego.