Java 如何在多线程上使用LongAdder

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

目前正在学习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();
        }
    }
}

我的理解有点低,但我想知道是否有一种使用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