見出し画像

golang sync.Mutexの使い方と注意点

今回はgolangのsync.Mutexについて解説していきます。

sync.Mutex

Go言語での並行処理は非常に強力であり、sync.MutexはGoで共有リソースへのアクセスを同期するために使われるツールの一つです。
Mutexは相互排除を意味し、複数のゴルーチンが同時に同じデータにアクセスすることを防ぎます。


sync.Mutexの基本的な使い方

インポートと変数定義

syncパッケージをインポートし、Mutex型の変数を定義します。

import "sync"

var mu sync.Mutex
var balance int

Mutexでのロックとアンロック

 共有リソースにアクセスする前にLock()メソッドを呼び出し、アクセスが完了したらUnlock()メソッドを呼び出してロックを解除します。

func deposit(amount int) {
    mu.Lock() 
    balance = balance + amount
    mu.Unlock() 
}

mu.Lock()を呼び出すことで、deposit関数がbalance変数を安全に変更できるようにミューテックスロックを獲得します。これにより他のゴルーチンがbalanceに同時にアクセスすることを防ぎます。

安全にロックを獲得した後、balance変数にamountの値を加算します。

更新が完了したら、mu.Unlock()を呼び出してロックを解除します。これにより他のゴルーチンがbalance変数へのアクセスや変更が可能になります。


sync.Mutexの注意点

デッドロックの回避

デッドロックは複数のゴルーチンがお互いの終了を待っている状態で発生します。特に複数のMutexを使用する場合に注意が必要です。


不要なロックの回避

不要にロックを使用すると、プログラムのパフォーマンスが低下します。
可能であればチャネルを使った同期や、他の同期メカニズムを検討してみましょう。


ロックの範囲を最小限に

ロックを保持する時間はなるべく短くすることが望ましいです。
必要な処理だけをロックし、その他の処理はロック外で行うようにします。


Unlockの呼び出しを保証する:

deferを使用して、パニックやエラーリターンの際もUnlock()が呼び出されるようにすると良いでしょう。これにより、リソースリークやデッドロックのリスクを減らすことができます。


Mutexの適切な使用

Mutexは状態の変更を伴う操作に対してのみ必要です。
データの読み取り専用の場合は、sync.RWMutexを使用すると、読み取り操作の並行性が向上し、より効率的になります。


golangをもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。
この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?