Interstage Application Serverにおいて、java.lang.Integerオブジェクトを使って排他制御ができません。

java.lang.Integerオブジェクトを使って排他制御しようとしましたが、できないのはなぜですか?
 private static Integer counter = 0;
 static int getCounter() {
  synchronized (counter) {
   return counter++;
  }
 }
java.lang.Integerオブジェクトはimmutableオブジェクトであり、整数値に紐付いてます。

 return counter++;

このような式は、Integerオブジェクト自体の内部値を変えるのではなく、counter変数が参照しているIntegerオブジェクトを変えることになります。したがって、counter変数が参照しているオブジェクトは頻繁に変わるため、

 synchronized (counter) {

という文で排他制御することは、ほぼ不可能です。また、

 https://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html

に、

 Use them only when there is an “impedance mismatch” between reference types and primitives

と記載されているように、単純な整数のインクリメントをするコードには、Integerクラスを使うべきではなく、以下のようなコーディングが推奨されます。

 private static int counter = 0;
 private static Object lock = new Object();
 static int getCounter() {
  synchronized (lock) {
   return counter++;
  }
 }

製品・サービス区分 Interstage
製品・サービス情報
対象製品 Interstage Application Server
バージョン V9, V8, V7, V6, V5, V4, V3, V2
プラットフォーム Windows, Solaris, Linux
アンサー種別 設計/開発
このページの先頭へ