java9 coutdown_Java并发之CountDownLatch

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

目录

CountDownLatch是什么?

CountDownLatch如何工作?

在实时系统中的应用场景

应用范例

常见的面试题

CountDownLatch是什么

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

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

f65cc83b7b4664916fad5d1398a36005.png

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 类中主要的方法?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338306.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsf 写一个action_一个JSF清单示例

jsf 写一个action这是使用JSF 2.0(JavaServer Faces)构建的示例列表应用程序。 该应用程序是待办事项列表。 该应用程序具有添加,编辑或删除列表中项目的功能。 待办事项具有名称和描述属性。 完成的应用程序的JSF页面具有: 使用…

c 中=和==的区别有哪些?

c 中和的区别1、含义不同:“”是赋值的意思。它的作用是将一个表达式的值赋给一个左值。一个表达式或者是一个左值,或者是一个右值。所谓左值是指一个能用于赋值运算左边的表达式。左值必须能够被修改,不能是常量。我们用变量作左值&#xff…

java内部格式_详解java内部类的访问格式和规则

详解java内部类的访问格式和规则1.内部类的定义定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述。2.内部类访问规则①内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中的成员&#xf…

primefaces_使用WildFly 8.2.0.Final,Primefaces 5.1和MySQL 5的JDBC领域和基于表单的身份验证...

primefaces我会不时查看我博客上最受欢迎的内容,并尝试最好地满足您的需求。 因此,阅读我的博客是其他读者推动内容的一种方式。 另一种方法是通过评论或电子邮件与我联系。 今天,我将使用Primefaces修改我的JDBC Realm示例并将其更新到最新的…

c语言语句以什么结束

c语言源程序的每一条语句都英文输入状态下的“;”结束一条语句。不同的版编权程语言有不同的结束标志,Java,C 也是以“;”作为一行语句的结束的标志,也有不需要用“;”作为一行语句结束的编程语言&#xff…

hadoop lambda_Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm

hadoop lambda最近,一群人要求我详细介绍我为我们的书《分布式实时计算的风暴蓝图》撰写的Druid / Storm集成。 德鲁伊很棒。 风暴很棒。 两者一起解决了实时维查询/聚合问题。 实际上,人们正在将其视为主流,称其为RAD Stack ,并…

C语言中sizeof和strlen的区别是什么

C语言中sizeof和strlen的区别是:strlen是一个函数,用来计算指定字符串str的长度,但不包括结束字符(即null字符);而sizeof是一个单目运算符,不是函数。区别分析:strlen 是一个函数&am…

c语言中continue语句的作用是什么

continue 的作用是结束本次循环,即跳过循环体中下面尚未执行的语句,然后进行下一次是否执行循环的判定。注意:continue 语句只结束本次循环,而不是终止整个循环。continue 只能在循环语句中使用,即只能在 for、while 和…

java jar killed_容器中Java 程序OOMKilled原因浅析

背景:业务的容器化刚刚搞完,线上开始告警,容器重启,容器重启。describe pod 查看原因是OOMKilled分析:OOMKilled 是pod 中的进程使用的内存超过了.spec.containers[*].resources.limits.memory中定义的内存限制&#x…

eof在c语言中表示什么

在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的…

go odroid_小众奇葩!Odroid Go Super简评

小众奇葩!Odroid Go Super简评2021-02-27 17:19:277点赞11收藏18评论小编注:此篇文章来自即可瓜分10万金币,周边好礼达标就有,邀新任务奖励无上限,点击查看活动详情儿时出生于苏北小城消息闭塞 玩具不多1994年 老爸南下…

strcpy函数的作用是什么

strcpy函数的作用是复制字符串。C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。声明下面是 strcpy() 函数的声明。c…

fork join框架_Fork / Join框架vs.并行流vs.ExecutorService:最终的Fork / Join基准

fork join框架Fork / Join框架在不同配置下如何工作? 就像即将到来的《星球大战》(Star Wars)一样,围绕Java 8并行性的批评也充满了兴奋。 并行流的语法糖带来了一些炒作,就像我们在预告片中看到的新型光剑一样。 现在…

scanf在c语言中的作用是什么?

scanf()函数scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include 。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include 。)…

amqp rabbitmq_通过Spring Integration和RabbitMQ获得高可用性的AMQP支持的消息通道

amqp rabbitmqSpring Integration消息通道默认情况下将消息存储在内存中。 这是因为内存速度快,易于实现,并且不会增加网络成本。 但是,在某些情况下,这可能会引起问题,因为如果应用程序崩溃或服务器意外关闭&#xff…

虚函数和纯虚函数的区别是什么?

虚函数(impure virtual)  C 的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。  子类可以重写父类的虚函数实现子类的特殊化。  如下就是一个父类中的虚函数:class A{public: virtual void ss(…

java 编译 器 ide_Java 8发布一年后,IDE和编译器尚未完全就绪

java 编译 器 ide一年前, 2014年3月18日 ,发布了Java SE 8,并通过lambda表达式和streams API带来了功能性编程的幸福。 这对于我们所有的Java生态系统都是个好消息,许多人已经升级到Java8。Stack Overflow已经提出了将近2500个有关…

windows.h有哪些函数

C语言windows.h库的常用函数1:FindWindow函数该函数可以通过窗口类名或者窗口标题名来查找特定窗口句柄,返回值是窗口的句柄(在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,或说是一个Delphi窗…

yxcms安装环境php,Windows7下PHP开发环境安装配置图文方法

操作系统:Windows 7 UltimateWEB服务器:IIS 6.1(内部版本7600)。数据库:MySql5.0.67PHP版本:5.2.13我还担心Win7下可能会不兼容,结果是一点问题都没有。一、安装MySql数据库客户端工具Navicat(导航猫)在这里下载&#…

apache camel_您的Apache Camel应用程序现在包括现成的文档

apache camel几个月前,我在博客中发布了有关即将发布的2.15版本的功能,该功能包括获取有关在端点上配置的每个属性的详细信息的功能-Apache Camel,请向我解释这些端点选项的含义 。 我们继续沿着这条道路前进,今天我们将其从端点…