AtomicReference <integer>与AtomicInteger之间的区别是什么?</integer>

时间:2013-04-21 19:20:03

标签: java concurrency java.util.concurrent atomicreference

我没有区别这两者:

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

VS

AtomicInteger atomicInteger = new AtomicInteger(1);

有人一般会说何时使用AtomicReference? 希望可以有人帮帮我。感谢。

4 个答案:

答案 0 :(得分:9)

一个非常重要的区别是方法compareAndSetweakCompareAndSetAtomicReference<Integer>的语义与对AtomicInteger的语义不同。这是因为使用AtomicReferece<Integer>时,这些方法使用==进行比较,而两个Integer对象可以相等而不是==。对于AtomicInteger,比较是整数值相等,而不是引用标识。

正如其他人所指出的那样,AtomicInteger具有AtomicReference<Integer>无法提供的其他功能。此外,AtomicInteger扩展了Number,因此它继承了所有Number方法(doubleValue()等),并且只要预期Number就可以使用。< / p>

答案 1 :(得分:8)

如果仅使用set(...)get(),但AtomicInteger还有一些其他方法(例如incrementAndGet()仅适用于整数),那么差别不大。

AtomicReference包裹volatile ObjectAtomicInteger包裹volatile int,因此它可以执行整数特定方法,包括递增,递减和添加方法。 AtomicInteger也扩展了Number,这意味着它支持doubleValue()longValue()等方法。

答案 2 :(得分:6)

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

AtomicInteger是包含整数的专用版本。它更有效(没有不必要的装箱),并且有一些有用的方法,如incrementAndGet()

答案 3 :(得分:2)

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

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

总结一下,使用AtomicInteger对数值运算更安全:)