正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。在这篇文章中,我将会涉及到在Java并发编 程中跟CountDownLatch相关的以下几点:

目录

CountDownLatch是什么?

CountDownLatch如何工作?

在实时系统中的应用场景

应用范例

常见的面试题

CountDownLatch是什么

CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

CountDownLatch的伪代码如下所示:

CountDownLatch如何工作

CountDownLatch.java类中定义的构造函数:

构造器中的计数值(count)实际上就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。

与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。

其他N 个线程必须引用闭锁对象,因为他们需要通知CountDownLatch对象,他们已经完成了各自的任务。这种通知机制是通过 CountDownLatch.countDown()方法来完成的;每调用一次这个方法,在构造函数中初始化的count值就减1。所以当N个线程都调 用了这个方法,count的值等于0,然后主线程就能通过await()方法,恢复执行自己的任务。

在实时系统中的使用场景

让我们尝试罗列出在java实时系统中CountDownLatch都有哪些使用场景。我所罗列的都是我所能想到的。如果你有别的可能的使用方法,请在留言里列出来,这样会帮助到大家。

实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。

开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。

死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。

CountDownLatch使用例子

在这个例子中,我模拟了一个应用程序启动类,它开始时启动了n个线程类,这些线程将检查外部系统并通知闭锁,并且启动类一直在闭锁上等待着。一旦验证和检查了所有外部服务,那么启动类恢复执行。

BaseHealthChecker.java:这个类是一个Runnable,负责所有特定的外部服务健康的检测。它删除了重复的代码和闭锁的中心控制代码。

NetworkHealthChecker.java:这个类继承了BaseHealthChecker,实现了verifyService()方法。DatabaseHealthChecker.java和CacheHealthChecker.java除了服务名和休眠时间外,与NetworkHealthChecker.java是一样的。

ApplicationStartupUtil.java:这个类是一个主启动类,它负责初始化闭锁,然后等待,直到所有服务都被检测完。

现在你可以写测试代码去检测一下闭锁的功能了。

常见面试题

可以为你的下次面试准备以下一些CountDownLatch相关的问题:

解释一下CountDownLatch概念?

CountDownLatch 和CyclicBarrier的不同之处?

给出一些CountDownLatch使用的例子?

CountDownLatch 类中主要的方法?

java9 coutdown_Java并发之CountDownLatch相关推荐

  1. Java高并发之CountDownLatch源码分析

    概述 CountDownLatch 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助.简单来说,就是 CountDownLatch 内部维护了一个计数器,每个线程完成自己的操作之后都 ...

  2. java epoll select_Java后端常见面试题

    写在前面: 本来每个问题上面都有超链接,都有相对应的答案.但是不知道为什么就是不能发布.想看每个问题的详细解答和知识点,点击文末左下角的"阅读原文"即可查看! 作者的话 Java基 ...

  3. 【牛客网面经整理】阿里面经

    作者:OfferOffer多多 链接:https://www.nowcoder.com/discuss/505316?type=post&order=time&pos=&pag ...

  4. java 计数器_java并发之计数器CountDownLatch原理

    java并发之计数器CountDownLatch原理 CountDownLatch简介 CountDownLatch顾名思义,count + down + latch = 计数 + 减 + 门闩(这么 ...

  5. java并发之同步辅助类CyclicBarrier和CountDownLatch

    CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...

  6. java并发计数器_浅谈java并发之计数器CountDownLatch

    CountDownLatch简介 CountDownLatch顾名思义,count + down + latch = 计数 + 减 + 门闩(这么拆分也是便于记忆=_=) 可以理解这个东西就是个计数器 ...

  7. 并发之AQS原理(一) 原理介绍简单使用

    并发之AQS原理(一) 如果说每一个同步的工具各有各的强大,那么这个强大背后是一个相同的动力,它就是AQS. AQS是什么 AQS是指java.util.concurrent.locks包里的Abst ...

  8. 你真的弄明白了吗?Java并发之AQS详解

    你真的弄明白了吗?Java并发之AQS详解 带着问题阅读 1.什么是AQS,它有什么作用,核心思想是什么 2.AQS中的独占锁和共享锁原理是什么,AQS提供的锁机制是公平锁还是非公平锁 3.AQS在J ...

  9. java 高并发_Java 高并发之无锁(CAS)

    Java 高并发之无锁(CAS) 本篇主要讲 Java中的无锁 CAS ,无锁 顾名思义就是 以不上锁的方式解决并发问题,而不使用synchronized 和 lock 等.. 1. Atomic 包 ...

最新文章

  1. ubuntu16.04下ROS最新换源方法,解决Hash sum mismatch 问题
  2. Kubernetes 弹性伸缩全场景解析 (一):概念延伸与组件布局
  3. 【python图像处理】图像的读取、显示与保存
  4. Problem B: 故障电灯(light)
  5. 牛客题霸 NC18 顺时针旋转矩阵
  6. 北方大学 ACM 多校训练赛 第十五场 蜘蛛牌A
  7. php callable 参数,php 利用反射执行callable
  8. mercurial和svn_DBA Mercurial简介–分支和合并
  9. java array 元素的位置_介绍java中的两种排序工具Arrays和Collections
  10. 电脑编程教学_上村CNC电脑锣编程培训按工厂模式整套实训
  11. 微pe工具箱 系统安装教程_装系统必备 微PE工具箱制作启动U盘教程
  12. 超像素分割 SLIC算法 使用示例
  13. 怎么找到电脑的打印机
  14. android开机固定程序,Android实现开机自启动某个程序
  15. 斯诺登逃亡之路上的守护天使都有谁
  16. 二次型相似对角化的原因
  17. Win7怎么打开磁盘管理?
  18. Windows 8实用窍门系列:6.Windows 8中的Popup使用方式
  19. 计算机组装与维修选择题大全,计算机组装与维修试题精选答案.跪求.
  20. SQL Server 2008 问题——已成功与服务器建立连接,但是在登录过程中发生错误。

热门文章

  1. ddl hibernate_Hibernate:DDL模式生成
  2. java ee cdi_Java EE CDI bean范围
  3. 基于比率的路由到旧版和现代应用程序–通过Spring Cloud的Netflix Zuul
  4. JVM上的高并发HTTP客户端
  5. HTTP请求和标头参数的CDI拦截器-简单示例
  6. 选择Vert.x的3个理由
  7. Spring MVC:测试简介
  8. 使用Xtend构建Vaadin UI
  9. CometD:Java Web应用程序的Facebook类似聊天
  10. Spring–设计领域模型和服务层