最近在学习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慢
发布于 2021-03-01 15:28:40
您有一个竞争条件;有一个非原子检查,然后修改。在检查该值是否未达到最大值后,您可以递增该值。这不是原子的,所以多个线程可以同时做这件事。如果你想要原子的东西,看看AtomicLong/AtomicInteger。
如果你想要有一个便宜的进程计数器,那么LongAdder是很有用的,通过它,多个线程可以(以非常高的速率)更新计数器,并且偶尔你会读出这个值。Sum可能非常昂贵,因为它需要迭代LongAdder中的每个计数器,并且对于每个计数器,它可能会获得对可能在调用核心处处于不正确状态的缓存线的访问。并且这导致大量的高速缓存一致性业务和潜在的存储器业务(例如,当脏的高速缓存行被写入主存储器时,就像在基于MESI的系统上发生的那样)。
https://stackoverflow.com/questions/66408158
复制相似问题