いももちのきもち

悪戦苦闘の歴史のメモ

synchronizedの小ネタ

仕事のKotlinのAndroidプロジェクトでsynchronizedを利用しているコードがあったのだが、実は意図していない挙動をしていたのでメモ

1. Booleanをsynchronizedして広すぎる範囲をロックしていた

maku77.github.io

falseもtrueもどこでも共通なので、synchronizedにbooleanを取るとそれらの処理は直列に処理されてしまうのでした。 業務で出会ったコードでは、バックグラウンドからの復帰時の互いに関係のない2つの処理が直列になっていたので、ロックオブジェクトでロックさせるようにしたところ並列で処理されるようになりました。

2. Kotlinのsuspend funcではsynchronizedで排他処理が効かない

qiita.com

ロックが外れる瞬間があるので、排他処理できないです。 suspendではmutex.lockを使います・

その他

qiita.com

ロックと言えばすぐdeadlockが思い浮かびますね。 ただsynchronizedの中でさらにsynchronizedしなければならないような状況はあるのかな...でも例えばサーバだと複数リソースのロックとるときは普通にあるので、まああるのかな。

kotlinlang.org マルチスレッドを扱う手法はKotlin公式を確認するのが一番です。