如何在多线程上使用LongAdder

  • 本文关键字:LongAdder 多线程 java
  • 更新时间 :
  • 英文 :


目前正在学习java,我偶然发现了LongAdder,它被指出比AtomicLong快所以我一直在努力使它工作,但最后的值总是1执行更多

import java.util.concurrent.atomic.LongAdder;
public class Main {
public static LongAdder counter = new LongAdder();
public static int Target = 100;
public static void main(String[] args) {
System.out.println("Starting Program");
for (int i=0;i<5;i++){
new Thread(Main::run).start();
}
new Thread(() -> {
updateprint();
}).start();
System.out.println(counter);
}
private static void run(){
try {
while (counter.intValue()<Target){
Thread.sleep(1000);
counter.increment();
counter.sum();
}
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void updateprint() {
try {
while (counter.intValue()<=Target ){
Thread.sleep(1500);
System.out.println("Updated Current Number :"+counter.intValue());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

输出
0
Updated Current Number :5
Updated Current Number :15
Updated Current Number :20
Updated Current Number :26
Updated Current Number :35
Updated Current Number :40
Updated Current Number :50
Updated Current Number :55
Updated Current Number :65
Updated Current Number :75
Updated Current Number :80
Updated Current Number :85
Updated Current Number :95
Updated Current Number :100
Updated Current Number :104
Process finished with exit code 0

我的理解有点低,但我想知道是否有一种方法使用LongAdder,可以工作,仍然保持快速,因为我被告知AtomicLong与很多线程相比,LongAdder慢

你有一个竞争条件;有一个非原子检查,然后修改。在检查它是否没有达到最大值之后,增加该值。这不是原子性的,因此多个线程可以同时执行此操作。如果你想要一些原子的东西,看看AtomicLong/AtomicInteger。

如果你想有一个便宜的进度计数器,多个线程可以更新计数器(以非常高的速率),并且偶尔会读取值,那么LongAdder是有用的。Sum的开销可能非常大,因为它需要遍历LongAdder中的每个计数器,并且对于每个计数器,它可能会获得对cacheline的访问权,而该cacheline在调用核心中可能处于不正确的状态。这导致了大量的缓存一致性流量和潜在的内存流量(例如,当脏缓存写入主存时,就会发生在基于MESI的系统上)。

最新更新