emahiro/b.log

日々の勉強の記録とか育児の記録とか。

Go で意図的に競合状態を発生させる

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)をチェックすることが出来ると良いし、こう言うケースに置いて単体テストで競合状態をシュッと作り出せるととってもスマートだなと思う。