前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CountDownLatch源码详细讲解

CountDownLatch源码详细讲解

原创
作者头像
查拉图斯特拉说
发布2024-01-31 23:11:26
690
发布2024-01-31 23:11:26
举报
文章被收录于专栏:后端架构后端架构

原理

CountDownLatch 的实现原理涉及到底层的线程同步和状态控制机制。在 CountDownLatch 内部,它使用了一个 Sync 内部类来实现具体的同步逻辑。Sync 类继承自 AQS(AbstractQueuedSynchronizer),这是一个用于构建锁和其他同步器的框架。

CountDownLatch 内部主要依赖于 AQS 的共享模式,通过共享模式下的状态值来控制线程的等待和唤醒。当计数器不为0时,调用 await 方法的线程会被阻塞,直到计数器为0;而每次调用 countDown 方法都会减少计数器的值,当计数器减为0时,所有等待的线程都会被唤醒。

在 CountDownLatch 的实现中,还使用了类似于信号量(Semaphore)的机制来进行状态的控制和线程的唤醒。通过这种方式,CountDownLatch 实现了线程之间的协调和等待。

示例

CountDownLatch 是 Java 中的一个同步辅助类,它可以帮助线程之间实现协调。下面是一个简单的 CountDownLatch 使用示例:

代码语言:javascript
复制
import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

    public static void main(String[] args) throws InterruptedException {
        // 创建一个 CountDownLatch 实例,设置初始计数为3
        CountDownLatch latch = new CountDownLatch(3);

        // 创建三个线程并启动它们
        new Thread(new Worker(latch)).start();
        new Thread(new Worker(latch)).start();
        new Thread(new Worker(latch)).start();

        // 主线程等待,直到计数器减为0
        latch.await();

        System.out.println("All workers have finished their tasks.");
    }

    static class Worker implements Runnable {
        private final CountDownLatch latch;

        Worker(CountDownLatch latch) {
            this.latch = latch;
        }

        public void run() {
            try {
                // 模拟工作任务
                Thread.sleep((int) (Math.random() * 1000));
                System.out.println("Worker finished its task.");
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            } finally {
                // 每个工作线程完成任务后,计数器减1
                latch.countDown();
            }
        }
    }
}

在这个示例中,创建了一个 CountDownLatch 实例,并将初始计数设置为3。然后创建了三个工作线程,在每个线程完成任务后,调用 countDown 方法来减少计数。主线程调用 await 方法来等待,直到计数器减为0,然后输出所有工作线程都完成了任务。

总结

总的来说,CountDownLatch 的实现原理涉及到 AQS 框架的使用,通过共享模式下的状态控制来实现线程的等待和唤醒,从而实现了线程之间的协调和同步。

最后 点赞关注评论一键三连,每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力

我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理
  • 示例
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档