我需要一个长实例变量。
该变量将保存一些事件时间(以毫秒为单位的时间)。
如果我只是将值设置为这么长并获取值,
那么使用 AtomicLong (并且只有它的 get() 和 set())而不是 long 有什么好处吗?
4 回答
看看文档AtomicLong
AtomicLong 用于原子递增的序列号等应用程序,不能用作 Long 的替代品。
这个特定的类旨在用于多线程环境以实现线程安全。
除非您需要线程安全,否则不要使用它。如果只需要这些方法,您可以为 long 变量提供自己的 getter 和 setter。
是的,有优势。
- 在多线程环境中,您将在线程之间获得可预测的结果。
- 这是一个方便的可变长。
但是,如果您不在多线程环境中操作,并且您想要的只是一个可变的 long,那么您最好使用自己的可变对象。在这种情况下使用AtomicLong
会使其他人感到困惑,并且会执行不必要的缓存管理。
只要将原始 long 声明为 volatile,或者使用 64 位 JVM,就没有任何优势。在 32 位 JVM 中对简单(非易失性)long 的分配不是原子的,因此一个线程可以开始分配(一些字节移入 long,但不是全部),然后另一个线程可以读取/访问 long 和得到一个损坏的值。在 64 位 JVM 中,分配和访问是原子的。同样,如果您将 long 声明为 volatile,它将以原子方式分配/访问。
如果您没有在自己的更新中使用它的值,则不需要它,但是如果您打算执行类似 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