golang

sync.MutexとDIコンテナを使う時の注意点

More than 1 year has passed since last update.

実際にやってしまったので戒めのためにメモしておきます。

DIコンテナで生成されるstructはシステムグローバルなシングルトンとして扱われ、2つ以上のリクエストをまたいで同じオブジェクトが参照される。つまり、DIコンテナの内部では2回目にstructを生成する時は、1回目に生成したstructをそのまま引き渡している。

もし、プロパティに「sync.Mutex」を持ったstructがDIコンテナによって生成され、同時に2つのプロセスがそのstructを参照すると、1つのsync.Mutexを共有して使ってしまうことになるので、片方のプロセスがMutex.Block()したまま処理を終了すると、もう片方のプロセスのMutex.Block()が永遠にBlockしたままになってしまう。
これは「sync.WaitGroup」でも同じ危険性がある。