Sobes.tech
Back to questions
Junior — Middle
88

Каким образом обеспечить безопасный доступ к карте в многопоточной среде?

Answer from AI

sobes.tech AI

В Go для безопасного доступа к карте (map) в многопоточной среде необходимо использовать синхронизацию, так как map не является потокобезопасной структурой данных. Самый распространённый способ — использовать мьютекс (sync.Mutex или sync.RWMutex) для блокировки доступа при чтении и записи.

Пример с использованием sync.RWMutex:

import (
    "sync"
)

var (
    m = make(map[string]int)
    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
}

Также в Go есть тип sync.Map, который реализует потокобезопасную карту с оптимизациями для частых операций чтения. Его можно использовать, если не нужна строгая типизация и нужна простота:

import "sync"

var m sync.Map

m.Store("key", 42)          // запись
value, ok := m.Load("key")  // чтение

Таким образом, для безопасного доступа к map в многопоточной среде используйте мьютексы или sync.Map.