Java 如何在多线程上使用LongAdder
目前正在学习java,我偶然发现了LongAdder,它被认为比AtomicLong更快 所以我一直在努力使它工作,但最后一个值总是多执行1次Java 如何在多线程上使用LongAdder,java,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 vo
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();
}
}
}
我的理解有点低,但我想知道是否有一种使用LongAdder的方法可以工作并且仍然保持快速,因为有人告诉我,与LongAdder相比,AtomicLong有很多线程,速度较慢您有一个竞争条件;有一个非原子检查,然后修改。在检查该值是否未达到最大值后,可以增加该值。这不是原子的,所以多个线程可以同时执行。如果您想要一些原子的东西,请查看AtomicLong/AtomicInteger 如果您想拥有一个便宜的进度计数器,多线程可以更新计数器(以非常高的速率),并且偶尔可以读取值,那么LongAdder非常有用。Sum可能非常昂贵,因为它需要迭代LongAdder中的每个计数器,对于每个计数器,它可能获得对缓存线的访问权,而缓存线在调用核心可能处于不正确的状态。这会导致大量的缓存一致性流量和潜在的内存流量(例如,当脏缓存线写入主内存时,基于MESI的系统会发生这种情况)
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