Go言語でmapの同時アクセスを安全にする方法

Go言語のMapはスレッド非同期であり、複数のgoroutineが同じMapに対して同時に読み書きを行うとデータ競合が発生する可能性があります。

マルチスレッドにおけるMapの安全性の問題を解決するには、以下の方法が挙げられます。

  1. Mapの読み書きを行う前にはMutexを取得し、操作後はMutexの解放を行う。これによって同一時刻にある1つのgoroutineのみがMapの操作を行うことができるため、競合状態を避けることができる。
import "sync"

var m = make(map[string]string)
var mutex = sync.Mutex{}

func updateMap(key, value string) {
    mutex.Lock()
    defer mutex.Unlock()
    m[key] = value
}
  1. 読み書きロック(RWMutex)を利用する: 読み書きロックを利用することで、複数のgoroutineが同時にMapに対して読み込みを行うことができるが、書き込みは1つのgoroutineのみに許容される。これにより、読み込み操作の並列性を高めることができる。
import "sync"

var m = make(map[string]string)
var rwMutex = sync.RWMutex{}

func updateMap(key, value string) {
    rwMutex.Lock()
    defer rwMutex.Unlock()
    m[key] = value
}

func readMap(key string) string {
    rwMutex.RLock()
    defer rwMutex.RUnlock()
    return m[key]
}

排他制御やリードライト制御を利用して、Mapのマルチスレッド化を効果的に実現できます。用途に応じた方式を選択してください。この場合、並列処理性能とセキュリティーの要求との兼ね合いが重要です。

bannerAds