如果您只是设置和获取值,那么使用AtomicLong有什么好处吗?



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

查看AtomicLong文档

AtomicLong用于诸如自动递增序号之类的应用程序中,不能用作Long的替代。

这个特定的类被设计用于多线程环境中,以保证线程安全。

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

是有优势的。

  1. 在多线程环境中,你将在线程之间得到可预测的结果。

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

如果你不使用它的值在它自己的更新,你不需要它,但如果你打算做一些像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

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

最新更新