Sobes.tech
Junior — Middle

Може ли да се осигури безопасност при едновременото четене на данни от Map в многонишково обкръжение?

sobes.tech AI

Отговор от AI

В Go стандартната карта (map) не е безопасна за едновремен достъп. Ако няколко горутини четат от map без писане, това е безопасно. Въпреки това, ако поне една горутина пише в map, едновременото четене и писане ще доведе до паника.

За безопасно едновременно четене от map без писане, можете да използвате обикновена map без синхронизация. Но ако има възможност за писане, трябва да използвате синхронизация, например чрез sync.RWMutex или sync.Map, който е специално разработен за конкурентен достъп.

Пример с sync.RWMutex за безопасно четене и писане:

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

// Писане
func write(key string, value int) {
    mu.Lock()
    defer mu.Unlock()
    m[key] = value
}

// Четене
func read(key string) (int, bool) {
    mu.RLock()
    defer mu.RUnlock()
    val, ok := m[key]
    return val, ok
}

Ако гарантирате, че map не се променя след инициализация, тогава едновременото четене е безопасно без допълнителна синхронизация.