Sobes.tech
Назад к вопросам
Junior — Middle
77

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

Ответ от нейросети

sobes.tech 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 не изменяется после инициализации, то одновременное чтение безопасно без дополнительной синхронизации.