synchronizedの小ネタ
仕事のKotlinのAndroidプロジェクトでsynchronizedを利用しているコードがあったのだが、実は意図していない挙動をしていたのでメモ
1. Booleanをsynchronizedして広すぎる範囲をロックしていた
falseもtrueもどこでも共通なので、synchronizedにbooleanを取るとそれらの処理は直列に処理されてしまうのでした。 業務で出会ったコードでは、バックグラウンドからの復帰時の互いに関係のない2つの処理が直列になっていたので、ロックオブジェクトでロックさせるようにしたところ並列で処理されるようになりました。
2. Kotlinのsuspend funcではsynchronizedで排他処理が効かない
ロックが外れる瞬間があるので、排他処理できないです。 suspendではmutex.lockを使います・
その他
ロックと言えばすぐdeadlockが思い浮かびますね。 ただsynchronizedの中でさらにsynchronizedしなければならないような状況はあるのかな...でも例えばサーバだと複数リソースのロックとるときは普通にあるので、まああるのかな。
kotlinlang.org マルチスレッドを扱う手法はKotlin公式を確認するのが一番です。