Sobes.tech
Junior — Middle

Jak zachowuje się program, jeśli jednocześnie odbywa się konkurencyjne odczytywanie wartości z mapy?

sobes.tech AI

Odpowiedź od AI

W Go bezpieczne jednoczesne odczyty z mapy nie powodują paniki ani błędów. Problemy pojawiają się, gdy jednocześnie dochodzi do zapisu lub odczytu i zapisu. Jeśli w programie tylko kilka gorutyn odczytuje wartości z mapy bez ich modyfikacji, jest to bezpieczne. Jednak jeśli choć jedna gorutyna modyfikuje mapę, konieczne jest użycie mechanizmów synchronizacji, takich jak sync.RWMutex lub sync.Map.

Przykład bezpiecznego odczytu z użyciem sync.RWMutex:

var m = make(map[string]int)
var mu sync.RWMutex

func read(key string) int {
    mu.RLock()
    defer mu.RUnlock()
    return m[key]
}

func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

W ten sposób, jednoczesny odczyt bez zapisu jest bezpieczny, ale przy zapisie konieczna jest synchronizacja.