首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在多线程上使用LongAdder

如何在多线程上使用LongAdder
EN

Stack Overflow用户
提问于 2021-02-28 18:43:21
回答 1查看 55关注 0票数 1

最近在学习java,我偶然发现了LongAdder,它被认为比AtomicLong更快,所以我一直在尝试让它工作,但最后的值总是多执行1次

代码语言:javascript
复制
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();
        }
    }
}

输出

代码语言:javascript
复制
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慢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-01 15:28:40

您有一个竞争条件;有一个非原子检查,然后修改。在检查该值是否未达到最大值后,您可以递增该值。这不是原子的,所以多个线程可以同时做这件事。如果你想要原子的东西,看看AtomicLong/AtomicInteger。

如果你想要有一个便宜的进程计数器,那么LongAdder是很有用的,通过它,多个线程可以(以非常高的速率)更新计数器,并且偶尔你会读出这个值。Sum可能非常昂贵,因为它需要迭代LongAdder中的每个计数器,并且对于每个计数器,它可能会获得对可能在调用核心处处于不正确状态的缓存线的访问。并且这导致大量的高速缓存一致性业务和潜在的存储器业务(例如,当脏的高速缓存行被写入主存储器时,就像在基于MESI的系统上发生的那样)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66408158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档