2013-04-21 21 views
6

私はこれら二つの違いを取得ドント:AtomicReference <Integer>とAtomicIntegerの違いは何ですか?

AtomicReference<Integer> atomicReference = new AtomicReference<>(1); 

AtomicInteger atomicInteger = new AtomicInteger(1); 

は、誰かが、一般的にAtomicReferenceを使用したときに言うことはできますか? 誰かが私を助けることを願っています。ありがとう。

答えて

9

非常に重要な違いは、compareAndSetweakCompareAndSetのメソッドがAtomicIntegerの場合と比べてAtomicReference<Integer>のセマンティクスが異なることです。これは、AtomicReferece<Integer>の場合、これらのメソッドは比較のために==を使用し、Integerのオブジェクトは==なしで等しくなる可能性があるためです。 AtomicIntegerでは、比較は整数値の等価性であり、参照同一性ではありません。

他の人が指摘しているように、AtomicIntegerにはAtomicReference<Integer>で利用できない追加機能があります。また、AtomicIntegerNumberに拡張されているので、Numberのメソッド(doubleValue()など)を継承し、Numberが必要な場合はいつでも使用できます。

+1

-127から128までの範囲の自動ボックス化されたIntegerオブジェクトはインターンされていて、その範囲外の整数はTrueを返します。 'new Integer(3)'で作成された整数は明らかに同じアイデンティティを持っていません。これはあらゆる種類の驚くべき振る舞いを引き起こす可能性があります。 –

+0

@ JedWesley-Smith - 優れた点。 APIによれば、その範囲外の値もキャッシュされます。問題を悪化させるために、「驚くべき振る舞い」はJavaプラットフォームによって異なる場合があります。 –

+0

それは、頼りにすべきではない、文書化されていないハッキングです。 –

6

AtomicReferenceは、任意の型を参照できる汎用クラスです。
独自のクラスのインスタンスをアトミックに使用する場合は、AtomicReference<V>が必要です。

AtomicIntegerは、整数を含む特殊バージョンです。それはより効率的です(不要なボクシングはありません)、incrementAndGet()のような便利な方法があります。

+1

ためのより安全です。 –

8

あまり違いあなただけset(...)get()使用しているが、AtomicIntegerは整数だけのために働くincrementAndGet()などのいくつかの他の方法を持っている場合。 AtomicIntegervolatile intはそれがインクリメント、デクリメントを含む整数特定の方法を行い、およびメソッドを追加することができラップvolatile Objectながら

AtomicReferenceはラップ。 AtomicIntegerNumberを拡張します。つまり、doubleValue(),longValue()などの方法をサポートします。

+1

なぜこれは緑色のチェックマークがつきませんでしたか?ヴェルネベルト? :) –

2

他で指摘されているように、AtomicReference<Integer>は==を使用してオブジェクトを比較します。したがって、compareAndSet(expect, update)は、expectが==を使用してアトミック参照に保存されているオブジェクトと等しい場合にのみ、最初の参照を更新します。

数字タイプにAtomicReferenceIntegerまたはLong)を使用すると、手間のかかるバグが発生する可能性があります。これらのクラスの静的コンストラクタ(たとえば、Integer.valueOf(int value))は、小さな値のために内部的にキャッシュされたオブジェクトを返します。つまり、Integer.valueOf(5)への2つの異なる呼び出しは、同じインスタンスIntegerを返します。クラスは不変なので、安全です。その結果、AtomicReference<Integer>を使用する場合は、実際にはAtomicIntegerを使用する必要があります。==は実際には同じオブジェクトを比較する可能性があるため、これらの小さな数値に対しては問題ありません。ある時点でより高い値で処理を開始した場合にのみ悪化します。

AtomicIntegerを使用して、要約すると、また、2つの `Integer`オブジェクトが同一であることなく、等しくすることができる数値演算:)

+0

Ted Hoppの答え​​を見てください。Integerオブジェクトのインターンは、すべてではなく、限られたセットに対してのみ起こります。インターンに依存することは、文書化されておらず、変更される可能性があるため、有害とみなされます。 –

+0

それは私が「小さな価値」を意味するものです。範囲を指定する必要はありませんでした。変化する可能性があるためです。私の結論は、まさにあなたが言っていることでした。数値オブジェクトのために働くことは決して決して頼りにしてはいけません。 – dah4ns

関連する問題