2

我需要一个长实例变量。
该变量将保存一些事件时间(以毫秒为单位的时间)。
如果我只是将值设置为这么长并获取值,
那么使用 AtomicLong (并且只有它的 get() 和 set())而不是 long 有什么好处吗?

4

4 回答 4

2

看看文档AtomicLong

AtomicLong 用于原子递增的序列号等应用程序,不能用作 Long 的替代品

这个特定的类旨在用于多线程环境以实现线程安全。

除非您需要线程安全,否则不要使用它。如果只需要这些方法,您可以为 long 变量提供自己的 getter 和 setter。

于 2015-09-09T08:31:45.430 回答
1

是的,有优势。

  1. 在多线程环境中,您将在线程之间获得可预测的结果。
  2. 这是一个方便的可变长。

但是,如果您不在多线程环境中操作,并且您想要的只是一个可变的 long,那么您最好使用自己的可变对象。在这种情况下使用AtomicLong会使其他人感到困惑,并且会执行不必​​要的缓存管理。

于 2015-09-09T08:41:28.000 回答
0

只要将原始 long 声明为 volatile,或者使用 64 位 JVM,就没有任何优势。在 32 位 JVM 中对简单(非易失性)long 的分配不是原子的,因此一个线程可以开始分配(一些字节移入 long,但不是全部),然后另一个线程可以读取/访问 long 和得到一个损坏的值。在 64 位 JVM 中,分配和访问是原子的。同样,如果您将 long 声明为 volatile,它将以原子方式分配/访问。

于 2015-09-10T16:43:03.670 回答
0

如果您没有在自己的更新中使用它的值,则不需要它,但是如果您打算执行类似 var.set(1+var.get()) 之类的操作并且使用多个线程,则除其他外,此可能性:

线程 1:x=var.get(); x=x+1;

线程 2: y=var.get(); y=y+1;

线程 1:var.set(x);

线程 2: var.set(y);

使用该序列,用户期望值增加了 2,但他们会看到它只增加了 1

于 2015-09-09T13:00:28.377 回答