Webアプリケーションのビジネスロジックで、とあるメソッドの同期を取りたいとする。そこでメソッドにsynchronized を宣言して実行してみたが、どうも上手く同期されていないようだ。そこでふと思ったのだが、Servlet自体がスレッドで複数実行されているため、その内部でsynchronized宣言したメソッドを呼んでもServletの1スレッド内でしか効果が無いのではないか。
という推測の元に手元の書籍などを調べてみると、「synchronized宣言したメソッドはオブジェクトのロックを取得する」とあった。ということは、Servletのスレッドごとに生成されたビジネスモデルのオブジェクトは別オブジェクトだからsynchronized宣言しても複数スレッドのServlet間で同期されるわけではなさそうだ。
対策としてはprivate static なクラス変数を定義し、同期させたいsynchronized ブロックでその変数をロックする。そうによってオブジェクトではなくクラスがロックされ、同一VM内での同期が可能となる。