他で指摘されているように、AtomicReference<Integer>
は==を使用してオブジェクトを比較します。したがって、compareAndSet(expect, update)
は、expect
が==を使用してアトミック参照に保存されているオブジェクトと等しい場合にのみ、最初の参照を更新します。
数字タイプにAtomicReference
(Integer
またはLong
)を使用すると、手間のかかるバグが発生する可能性があります。これらのクラスの静的コンストラクタ(たとえば、Integer.valueOf(int value)
)は、小さな値のために内部的にキャッシュされたオブジェクトを返します。つまり、Integer.valueOf(5)
への2つの異なる呼び出しは、同じインスタンスInteger
を返します。クラスは不変なので、安全です。その結果、AtomicReference<Integer>
を使用する場合は、実際にはAtomicInteger
を使用する必要があります。==は実際には同じオブジェクトを比較する可能性があるため、これらの小さな数値に対しては問題ありません。ある時点でより高い値で処理を開始した場合にのみ悪化します。
はAtomicInteger
を使用して、要約すると、また、2つの `Integer`オブジェクトが同一であることなく、等しくすることができる数値演算:)
-127から128までの範囲の自動ボックス化されたIntegerオブジェクトはインターンされていて、その範囲外の整数はTrueを返します。 'new Integer(3)'で作成された整数は明らかに同じアイデンティティを持っていません。これはあらゆる種類の驚くべき振る舞いを引き起こす可能性があります。 –
@ JedWesley-Smith - 優れた点。 APIによれば、その範囲外の値もキャッシュされます。問題を悪化させるために、「驚くべき振る舞い」はJavaプラットフォームによって異なる場合があります。 –
それは、頼りにすべきではない、文書化されていないハッキングです。 –