我不明白这两者之间的区别:
AtomicReference<Integer> atomicReference = new AtomicReference<>(1);
对比
AtomicInteger atomicInteger = new AtomicInteger(1);
有人可以说什么时候使用 AtomicReference 吗?希望可以有人帮帮我。谢谢。
我不明白这两者之间的区别:
AtomicReference<Integer> atomicReference = new AtomicReference<>(1);
对比
AtomicInteger atomicInteger = new AtomicInteger(1);
有人可以说什么时候使用 AtomicReference 吗?希望可以有人帮帮我。谢谢。
一个非常重要的区别是方法compareAndSet
和weakCompareAndSet
具有不同的AtomicReference<Integer>
语义AtomicInteger
。这是因为 with AtomicReference<Integer>
,那些==
用于比较的方法,两个Integer
对象可以相等而不为==
。与AtomicInteger
,比较是整数值相等,而不是引用标识。
正如其他人指出的那样,AtomicInteger
具有AtomicReference<Integer>
. 此外,AtomicInteger
extends Number
,因此它继承了所有Number
方法(doubleValue()
等),并且可以在需要 a 时使用Number
。
如果您使用 justset(...)
并没有太大区别,get()
但是AtomicInteger
还有一些其他方法,例如incrementAndGet()
仅适用于整数的方法。
AtomicReference
包装一个volatile Object
whileAtomicInteger
包装一个,volatile int
因此它可以执行整数特定的方法,包括增量、减量和添加方法。 AtomicInteger
也扩展Number
,这意味着它支持doubleValue()
,longValue()
等方法。
AtomicReference
是一个可以引用任意类型的泛型类。
如果您想以原子方式使用您自己的类的实例,则需要AtomicReference<V>
.
AtomicInteger
是一个包含整数的特殊版本。它更高效(没有不必要的装箱),并且具有有用的方法,例如incrementAndGet()
.
正如其他人指出的那样,AtomicReference<Integer>
使用 == 来比较对象。因此,仅当等于使用 == 存储在您的原子引用中的对象时compareAndSet(expect, update)
才会更新您的初始引用。expect
如果您将AtomicReference
其用于数字类型,即Integer
或Long
. 请注意,这些类的静态构造函数(例如Integer.valueOf(int value)
)返回内部缓存的小值对象。换句话说,两个不同的调用Integer.valueOf(5)
返回相同的Integer
. 这是安全的,因为类是不可变的。结果,如果你使用AtomicReference<Integer>
while 你真的应该使用AtomicInteger
,它可能适用于这些小数字,因为 == 实际上可能会比较相同的对象。只有当您在某个时候开始处理更高的值时,它才会变得更糟。
总而言之,使用AtomicInteger
数字运算更安全:)