9

我不明白这两者之间的区别:

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

对比

AtomicInteger atomicInteger = new AtomicInteger(1);

有人可以说什么时候使用 AtomicReference 吗?希望可以有人帮帮我。谢谢。

4

4 回答 4

13

一个非常重要的区别是方法compareAndSetweakCompareAndSet具有不同的AtomicReference<Integer>语义AtomicInteger。这是因为 with AtomicReference<Integer>,那些==用于比较的方法,两个Integer对象可以相等而不为==。与AtomicInteger,比较是整数值相等,而不是引用标识。

正如其他人指出的那样,AtomicInteger具有AtomicReference<Integer>. 此外,AtomicIntegerextends Number,因此它继承了所有Number方法(doubleValue()等),并且可以在需要 a 时使用Number

于 2013-04-21T19:28:57.063 回答
8

如果您使用 justset(...)并没有太大区别,get()但是AtomicInteger还有一些其他方法,例如incrementAndGet()仅适用于整数的方法。

AtomicReference包装一个volatile ObjectwhileAtomicInteger包装一个,volatile int因此它可以执行整数特定的方法,包括增量、减量和添加方法。 AtomicInteger也扩展Number,这意味着它支持doubleValue(),longValue()等方法。

于 2013-04-21T19:21:31.943 回答
6

AtomicReference是一个可以引用任意类型的泛型类。
如果您想以原子方式使用您自己的类的实例,则需要AtomicReference<V>.

AtomicInteger是一个包含整数的特殊版本。它更高效(没有不必要的装箱),并且具有有用的方法,例如incrementAndGet().

于 2013-04-21T19:21:30.083 回答
2

正如其他人指出的那样,AtomicReference<Integer>使用 == 来比较对象。因此,仅当等于使用 == 存储在您的原子引用中的对象时compareAndSet(expect, update)才会更新您的初始引用。expect

如果您将AtomicReference其用于数字类型,即IntegerLong. 请注意,这些类的静态构造函数(例如Integer.valueOf(int value))返回内部缓存的小值对象。换句话说,两个不同的调用Integer.valueOf(5)返回相同的Integer. 这是安全的,因为类是不可变的。结果,如果你使用AtomicReference<Integer>while 你真的应该使用AtomicInteger,它可能适用于这些小数字,因为 == 实际上可能会比较相同的对象。只有当您在某个时候开始处理更高的值时,它才会变得更糟。

总而言之,使用AtomicInteger数字运算更安全:)

于 2013-04-21T20:24:46.100 回答