【JUC】CountDownLatch

【JUC】CountDownLatch,第1张

【JUC】CountDownLatch

CountDownLatch
  • 一、概述
    • 1.1 案例
    • 代码
    • 解决方案

一、概述

CountDownLatch允许一个或多个线程等待其他线程完成 *** 作

1.1 案例

假设由50个线程,有一个原子类AtomicInteger,50个线程都对该类进行自增1000次

代码
public class AtomicDemo {
    static AtomicInteger atomicInteger = new AtomicInteger();

    public static void main(String[] args) {
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    atomicInteger.incrementAndGet();
                }
            },String.valueOf(i)).start();

        }
        System.out.println(Thread.currentThread().getName() + atomicInteger.get());
    }
}

如果执行上面的代码会出现结果不对的情况,原因就是main线程打印结果时,50个线程自增的 *** 作还未执行完。

解决方案

使用CountDownLatch进行计数,知道50个线程都完成自增 *** 作之后,再进行打印结果 *** 作

public class AtomicDemo {
    static AtomicInteger atomicInteger = new AtomicInteger();

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(50);
        for (int i = 0; i < 50; i++) {
            new Thread(() -> {

                try {
                    for (int j = 0; j < 1000; j++) {
                        atomicInteger.incrementAndGet();
                    }
                } catch (Exception exception) {
                    exception.printStackTrace();
                } finally {
                    countDownLatch.countDown();
                }

            },String.valueOf(i)).start();

        }
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName() + atomicInteger.get());
    }
}

此时我们就不会出现结果不正确的情况了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5612178.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存