Sobes.tech
Intern

Czy odczyt map w Go jest bezpieczny wątkowo?

sobes.tech AI

Odpowiedź od AI

W języku Go odczyt z map nie jest bezpieczny dla wątków, jeśli jednocześnie dochodzi do zapisu. Aby bezpiecznie odczytywać z map w środowisku wielowątkowym, należy użyć synchronizacji, na przykład sync.RWMutex do blokowania odczytu i zapisu, lub użyć sync.Map, który jest specjalnie zaprojektowany do dostępu współbieżnego.

Przykład z sync.RWMutex:

import (
    "sync"
)

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

func read(key string) (int, bool) {
    mu.RLock()         // blokada odczytu
    defer mu.RUnlock() // odblokowanie
    val, ok := m[key]
    return val, ok
}

func write(key string, val int) {
    mu.Lock()         // blokada zapisu
    defer mu.Unlock() // odblokowanie
    m[key] = val
}

Lub użyć sync.Map:

import "sync"

var m sync.Map

func read(key string) (interface{}, bool) {
    return m.Load(key)
}

func write(key string, val interface{}) {
    m.Store(key, val)
}

sync.Map jest przydatny, gdy wykonuje się wiele operacji współbieżnych, ale ma specyficzne cechy pod względem wydajności i API.