Summary
- Go では
concrrent map writes
のような競合状態の可能性がある実装があるときに排他ロックをかける。 - 競合状態を回避するためのサンプルとしてロックをかける実装はたくさんインターネット上に情報が出てくるが、そもそも意図的に競合状態を作り出すサンプルがなかったので書いてみた。
- Go のテストで競合状態をチェックするには
race
オプションを使用する
競合状態チェックの実装
https://github.com/emahiro/il/pull/6 に記載した。
一応並行処理のため、毎回確実に発生するわけではないが数回に一度は concurrent map writes
が発生する。
そのため go test . -race
で競合状態のチェックをかけるとテストが落ちるようになっている。
コード上は同期的な処理に見えても、マイクロサービス内で飛び交うリクエストなど並行に処理がされるケースに置いて concurrent mas writes
が発生しうる場合には test で並行に動かしてみて競合状態 (race conditons)をチェックすることが出来ると良いし、こう言うケースに置いて単体テストで競合状態をシュッと作り出せるととってもスマートだなと思う。