PR

Go言語(Golang)でマップ(map)型の排他制御にはsync.Mapを使う!

基礎

こんにちは。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」パッケージが使えるので覚えておきましょう!

 

この記事を書いた人
Tomoyuki

SE→ブロガーを経て、現在はWeb系エンジニアをしています!

Tomoyukiをフォローする
基礎
スポンサーリンク
Tomoyukiをフォローする

コメント

タイトルとURLをコピーしました