Senior
Welche Probleme beim gleichzeitigen Zugriff treten auf, wenn die Methoden Get und Set aus verschiedenen Goroutines aufgerufen werden? Wie kann man sie lösen?
sobes.tech KI
Antwort von AI
Wenn die Methoden Get und Set gleichzeitig von verschiedenen Goroutines aufgerufen werden, tritt ein Datenrennen (data race) auf. Dies liegt daran, dass mehrere Goroutines gleichzeitig auf gemeinsame Daten lesen und diese ändern können, was zu unvorhersehbarem Verhalten und Fehlern führt.
Um dieses Problem in Go zu lösen, verwendet man in der Regel:
- Mutex (sync.Mutex) — sperrt den Zugriff auf die Daten während der Operation, um exklusiven Zugriff zu gewährleisten.
- RWMutex (sync.RWMutex) — erlaubt mehreren Goroutines gleichzeitig das Lesen der Daten, sperrt aber das Schreiben, wenn jemand schreibt.
- Channels — um den sequenziellen Zugriff auf Daten durch Nachrichtenübertragung zu organisieren.
Beispiel mit RWMutex:
import "sync"
type SafeMap struct {
mu sync.RWMutex
data map[string]string
}
func (m *SafeMap) Get(key string) (string, bool) {
m.mu.RLock() // Lese-Sperre
defer m.mu.RUnlock()
val, ok := m.data[key]
return val, ok
}
func (m *SafeMap) Set(key, value string) {
m.mu.Lock() // Schreib-Sperre
defer m.mu.Unlock()
m.data[key] = value
}
Dieser Ansatz stellt sicher, dass die Daten bei gleichzeitiger Zugriff nicht beschädigt werden.