こんにちは。Tomoyuki(@tomoyuki65)です。
以前の記事でgoroutine(ゴールーチン)による並行処理や、mutex(ミューテックス)による排他制御などについて解説しましたが、排他制御が可能なマップ(map)型を扱うことができる「sync.Map」パッケージも存在します。
この記事では、そんな「sync.Map」について解説します。
【関連記事】

Go言語(Golang)はgoroutine(ゴールーチン)で並行処理が可能!
こんにちは。Tomoyuki(@tomoyuki65)です。Go言語(Golang)ではgoroutine(ゴールーチン)を使うことによって並行処理が可能なため、上手く使えばパフォーマンス改善に繋がります!※プログラムは通常一行ずつ処理をし...

Go言語(Golang)のmutex(ミューテックス)でgoroutine(ゴールーチン)の排他制御を知る!
こんにちは。Tomoyuki(@tomoyuki65)です。Go言語(Golang)でgoroutine(ゴールーチン)から共有リソースに対して読み書きをする必要がある場合、何も考慮しなければ競合状態になってエラーが発生する可能性があるので...

Go言語(Golang)の配列(array)・スライス(slice)・マップ(map)の使い方や違いについて
こんにちは。Tomoyuki(@tomoyuki65)です。Go言語(Golang)で複数のデータを扱う際は配列(array)、スライス(slice)、マップ(map)を利用しますが、使い方や違いについて迷うことがあると思います。この記事で...
Go言語(Golang)でマップ(map)型の排他制御にはsync.Mapを使う!
goroutine(ゴールーチン)で並行処理をさせる際に排他制御が必要な場合、mutex(ミューテックス)を使うことで実現できます。
ただマップ(map)型で排他制御が必要な場合については、「sync.Map」パッケージがあるので、これを使うことでも実現可能で、使い方の例としては次の通りです。
package main
import (
"fmt"
"sync"
)
func main() {
var m sync.Map
var wg sync.WaitGroup
// 10個のgoroutineでマップのcountをカウントアップさせる
for i := 0; i < 10; i++ {
wg.Add(1)
// goroutineで並行処理
go func() {
defer wg.Done()
// キーの存在チェック
value, ok := m.Load("count")
if ok {
// キーが存在したら値に+1する
c := value.(int) + 1
m.Store("count", c)
} else {
// 初回は1を登録する
m.Store("count", 1)
}
}()
}
wg.Wait()
// countの値を取得して出力
value, ok := m.Load("count")
if ok {
fmt.Println("countの値:", value)
} else {
fmt.Println("countの値はありません。")
}
}
実行結果
countの値: 10
上記の例ではデータを保存するメソッド「m.Store()」、データを取得するメソッド「m.Load()」を使いましたが、他にもキーがあれば取得し、なければ値を保存するメソッド「m.LoadOrStore()」、ループ処理用のメソッド「m.Range()」、キーを削除するメソッド「m.Delete()」、マップを空にするメソッド「m.Clear()」などもあります。
最後に
今回はGo言語(Golang)のsync.Mapについて解説しました。
goroutine(ゴールーチン)を扱う際は排他制御も考慮する必要がありますが、マップ(map)型の排他制御をしたい場合は、「sync.Map」パッケージが使えるので覚えておきましょう!
コメント