Go言語でmapの同時アクセスを安全にする方法
Go言語のMapはスレッド非同期であり、複数のgoroutineが同じMapに対して同時に読み書きを行うとデータ競合が発生する可能性があります。
マルチスレッドにおけるMapの安全性の問題を解決するには、以下の方法が挙げられます。
- 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
}
- 読み書きロック(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のマルチスレッド化を効果的に実現できます。用途に応じた方式を選択してください。この場合、並列処理性能とセキュリティーの要求との兼ね合いが重要です。