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