Java中的AtomicLong用于什么?

53

有人能解释一下AtomicLong的用途吗?例如,以下语句的区别是什么?

private Long transactionId;
private AtomicLong transactionId;
1个回答

62

这两个对象之间存在显著的差异,尽管最终结果是相同的,但它们在使用方法和环境上明显不同。

当你需要:

  • 使用包装类(wrapper class)
  • 处理集合(collection)
  • 只想处理对象而不是原始类型(这有点奏效)

时,使用基本的Long对象。

当你需要:

  • 确保值可以在并发环境中使用
  • 不需要包装类(因为该类不会自动装箱)

时,使用AtomicLong

单独的Long对象不允许线程互操作,因为两个线程都可能看到并更新相同的值,但是对于AtomicLong,多个线程将看到相同的值的保证相当不错。

如果你从未涉及线程,则不需要使用AtomicLong


当你写下:“Long本身不允许线程互操作,因为两个线程都可以看到并更新相同的值”,如何修改Long对象?我认为Long是不可变的,并且我没有在Long类中找到任何修改值的方法。 - Philippe G.
1
@PhilippeG.:如果您没有正确同步,那么您始终可以更改字段。 Long类是不可变的,但其在内存中的位置不是。 - Makoto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接