9

これら2つの違いがわかりません:

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

対。

AtomicInteger atomicInteger = new AtomicInteger(1);

AtomicReference をいつ使うべきか、誰かが一般的に言うことができますか? 誰かが私を助けてくれることを願っています。ありがとう。

4

4 に答える 4

13

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

他の人が指摘したように、AtomicIntegerには では利用できない追加機能がありますAtomicReference<Integer>。また、AtomicIntegerextendsであるため、すべてのメソッド (など) をNumber継承し、 aが期待されるときはいつでも使用できます。NumberdoubleValue()Number

于 2013-04-21T19:28:57.063 に答える
8

set(...)andget()だけを使用している場合は大きな違いはありませんが、整数に対してのみ機能AtomicIntegerするなどの他の方法があります。incrementAndGet()

AtomicReferenceラップ a volatile ObjectwhileAtomicIntegerラップa をラップするため、volatile intインクリメント、デクリメント、およびメソッドの追加を含む整数固有のメソッドを実行できます。 AtomicIntegerも拡張します。これは、、 などのメソッドNumberをサポートすることを意味します。doubleValue()longValue()

于 2013-04-21T19:21:31.943 に答える
6

AtomicReference任意の型を参照できるジェネリック クラスです。
独自のクラスのインスタンスをアトミックに使用する場合は、AtomicReference<V>.

AtomicInteger整数を含む特殊なバージョンです。より効率的で (不要なボクシングがない)、 のような便利なメソッドがありincrementAndGet()ます。

于 2013-04-21T19:21:30.083 に答える