Dev Study
Go コース

53. sync.Once と atomic — 一度きりの実行と原子的な操作

sync.Once は、何度呼ばれても中の関数を一度だけ実行する仕組みです。once.Do(f) を複数の goroutine から呼んでも、f が走るのは最初の1回だけで、残りは f の完了を待ってから戻ります。初期化処理を確実に1回だけ行いたいときに便利です。

sync/atomic パッケージは、ロックを使わずに整数などを原子的に(途中で割り込まれずに)操作するための関数を提供します。atomic.AddInt64 や Go 1.19 以降の atomic.Int64 型などがあり、単純なカウンタの加算なら Mutex より軽量に競合を防げます。

下の例では Once で初期化を1回だけ行い、atomic.Int64 で 100 個の goroutine からカウンタを安全に加算します。どちらも競合しないため、出力は毎回同じです。

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Go
公式ドキュメントで詳しく ↗