DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE

FindBugs に

private Integer activeThreadCount = 0;
...
synchronized (activeThreadCount) {
activeThreadCount++;
}

みたいに書いていたら、DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE と怒られた。はて、何だろと思ったら、activeThreadCount = 0 が内部的には activeThreadCount = Integer.valueOf(0) になり、Integer.valueOf(0) は -128~127 でキャッシュを利用するから、synchronized の対象が意図しない、共有されるオブジェクトになるためみたい(つまり、新規に作った固有のオブジェクトという感じじゃない)。というわけで、ロックしたかったら、それようのロックオブジェクトを作るべしということみたい。なるほどね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です