我没有区别这两者:
AtomicReference<Integer> atomicReference = new AtomicReference<>(1);
VS
AtomicInteger atomicInteger = new AtomicInteger(1);
有人一般会说何时使用AtomicReference? 希望可以有人帮帮我。感谢。
答案 0 :(得分:9)
一个非常重要的区别是方法compareAndSet
和weakCompareAndSet
对AtomicReference<Integer>
的语义与对AtomicInteger
的语义不同。这是因为使用AtomicReferece<Integer>
时,这些方法使用==
进行比较,而两个Integer
对象可以相等而不是==
。对于AtomicInteger
,比较是整数值相等,而不是引用标识。
正如其他人所指出的那样,AtomicInteger
具有AtomicReference<Integer>
无法提供的其他功能。此外,AtomicInteger
扩展了Number
,因此它继承了所有Number
方法(doubleValue()
等),并且只要预期Number
就可以使用。< / p>
答案 1 :(得分:8)
如果仅使用set(...)
和get()
,但AtomicInteger
还有一些其他方法(例如incrementAndGet()
仅适用于整数),那么差别不大。
AtomicReference
包裹volatile Object
而AtomicInteger
包裹volatile int
,因此它可以执行整数特定方法,包括递增,递减和添加方法。 AtomicInteger
也扩展了Number
,这意味着它支持doubleValue()
,longValue()
等方法。
答案 2 :(得分:6)
AtomicReference
是一个可以引用任意类型的泛型类
如果您想原子地使用自己的类的实例,则需要AtomicReference<V>
。
AtomicInteger
是包含整数的专用版本。它更有效(没有不必要的装箱),并且有一些有用的方法,如incrementAndGet()
。
答案 3 :(得分:2)
正如其他人所指出的,AtomicReference<Integer>
使用==来比较对象。因此,只有当compareAndSet(expect, update)
等于使用==时存储在原子引用中的对象时,expect
才会更新初始引用。
如果您将AtomicReference
用于数字类型,即Integer
或Long
,则可能会导致一些棘手的错误。请注意,这些类的静态构造函数(例如,Integer.valueOf(int value)
)返回内部缓存的对象以获取较小的值。换句话说,对Integer.valueOf(5)
的两次不同调用会返回Integer
的同一个实例。它是安全的,因为类是不可变的。在结果中,如果您使用AtomicReference<Integer>
而您应该使用AtomicInteger
,那么它可能适用于这些小数字,因为==实际上可能会比较相同的对象。只有当你开始在某个时刻处理更高的值时,它才会变得更糟。
总结一下,使用AtomicInteger
对数值运算更安全:)