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 | ||||||
---|---|---|---|---|---|---|---|
製品・サービス情報 |
|
||||||
アンサー種別 | 設計/開発 |