Sobes.tech
Junior — Middle

Da li je moguće obezbediti sigurnost prilikom istovremenog čitanja podataka iz Map u višestrukom okruženju?

sobes.tech АИ

Одговор од АИ

У Go-у, стандардна карта (map) није безбедна за истовремени приступ. Ако више goroutines чита из map без писања, то је безбедно. Међутим, ако бар једна goroutine пише у 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 не мења након иницијализације, онда је истовремено читање без додатне синхронизације безбедно.