Java で wait() を呼ぶ時は、該当スレッドで synchronized していることが必要となる。これをしておかないと、wait() を読んだ時に、IllegalMonitorStateException が発生する。なので、これまでは無条件に synchronized してから wait() していた。
しかし、なぜ synchronized が必要なのかについては分かっていなかったので、ちょっと調べてみたところ、以下の記事を見つけた。
https://code-examples.net/ja/q/2a695c
上記より、synchronized してから wait() しないと、そのスレッドが意図せず wait し続けてしまう可能性があり、そうなってしまうのを防ぐ目的があると理解した。つまり、プログラマがマルチスレッドの処理でバグを作り込まないようにするための、Java 側の配慮であると思っている。他にも理由がありそうなので、また何か分かったら、ここに追記したいと思う。