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 の対象が意図しない、共有されるオブジェクトになるためみたい(つまり、新規に作った固有のオブジェクトという感じじゃない)。というわけで、ロックしたかったら、それようのロックオブジェクトを作るべしということみたい。なるほどね。

カテゴリー: Java パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload the CAPTCHA.