从火箭发场景来学习Java多线程并发闭锁对象

倒计时器场景

在我们开发过程中,有时候会使用到倒计时计数器。最简单的是:int size = 5; 执行后,size—这种方式来实现。但是在多线程并发的情况下,这种操作会不安全的。举个现实中最典型的一个例子:火箭发射的案例。

大家都看过火箭发射的直播吧。火箭在发送的时候,有很多设备需要检查是否都准备就绪。在总控室得到所有设备都准备就绪后,才会下达发射的命令。我们也知道,火箭发射有很多设备需要检验,这不是一个部门一个一个检查的,而是多个部门协同配合实现的。如果把一个个部门看作不同的线程的话。我们就可以假设:

如果是一个部门一个一个设备检查,这就是单线程操作的;

如果是多个部门协同配合的话,就是多线程的。

所以说,在火箭发射前检查设备是 多线程情况下进行的。

我们也不知道,不同部门负责检查的设备的复杂度不同,速度不同,就会导致有些部门检查完成的快,有些部门检查完成的慢。这个过程我们可以理解为不同线程在竞争CPU资源的时候不同。

假设有5个部门同时协同工作,这5个部门的操作可以看作是一组操作。因为速度不同,那么总控室下达发射的命令是以哪个检查完毕为准呢?是A部门还是B部门或者D部门呢?都不是,总控室下达发射的命令是在得到5个部门都检查完毕后才会下达发射的命令。我们也可以理解为总控室在得到这一组(五个部门)都操作完成才执行的。此时总控室可以理解为一个线程,五个部门一组可以理解一个线程组。

从上面现实生活中的案例分析,我们来想想上面的操作用Java程序怎么实现 ?

使用count—的代码实现

模拟不同部门的线程:

编辑

我们先来看看常规的。使用count--的效果。

模拟总控室的主线程:

编辑

从上面代码中,我们可以看到当计数器count减到0的时候,总控室下达发射命令。这个从逻辑上来说,是正确的,没问题的。我们来看看运行结果:

运行结果:

编辑

从运行结果,我们可以看到,当总控室接收到count =0的指令后,认为各个部门都已经检查完毕了。所以就下达了发射命令。但是在最后,我们发现火箭已经发射了,部门4和5才想总控室汇报检查完毕,准备就绪。这种情况是很危险的。因为我们知道火箭的造价是很昂贵的而且凝聚了很多科研人员的心血。如果因为某个部门未检查完毕就发射而导致火箭发射失败或者坠落,在现实生活中,这种情况是不允许出现的。

那么这种情况,在Java中,怎么解决呢?可以使用countdownlatch这个对象来解决。

Countdownlatch

Countdownlatch是什么?

先来看看源码中怎么解释的:A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

什么意思呢?

简单的来说,是一个同步辅助工具类,运行一个或多个线程在等待其他线程完成一组操作后再接着执行的工具类。

实现的流程:

通过一个计数器来实现的,计数器的初始值就是要执行的线程的数量。每当一个线程执行完毕之后,计数器的值就会减一,当计数器的的减少到0的时候,表示所有的线程都执行完毕了。然后再闭锁上等待的其他线程就可以恢复正常工作了。

来看看主要的方法

编辑

说明:

Sync:是countdownlatch内部类,继承AbstractQueuedSynchronizer使用AQS状态来代替计数的。

有参构造器:public CountDownLatch(int count){}

await():等待方法。还有一个带参数重载的方法。

countdown():执行计数器减1操作的方法。

使用countdownlatch模拟火箭发射前准备代码:

我们来看看使用countdownlatch来模拟火箭发射前准备会不会出问题。

来看看模拟部门的线程代码:

编辑

为了保证计数器减一操作不受子线程运行结果影响,讲count.coundDown()操作放在finally代码块里面。

再来看看总控室下达发射命令的主线程:

编辑

在downLatch.await()之后,下达发射命令。

查看运行结果:

编辑

我们可以看到,当所有部门都准备就绪后,总控室接收到完成的指令后,下达发射火箭命令。这个流程才是正常的。从运行结果来看也是正常的。

使用场景:

场景1:某线程在运行前需要等待其他N个线程执行完成之后在执行。

比如:

容器启动spring 容器的启动,需要初始化、bean装配、检查其他依赖等加载完毕之后,在主线程在继续执行;

在比如:电商中统计库存问题。我们知道,一个电商项目有很多分类,不同分类下的库存不一样。如果要统计当前剩余总库存。这个时候,就可以使用其他线程统计每个分类下的库存。等所有分类都统计完成之后,主线程在进行汇总操作。

java 闭锁_从火箭发场景来学习Java多线程并发闭锁对象相关推荐

  1. java火箭应用_从火箭发场景来学习Java多线程并发闭锁对象

    原标题:从火箭发场景来学习Java多线程并发闭锁对象 从火箭发场景来学习Java多线程并发闭锁对象 倒计时器场景 在我们开发过程中,有时候会使用到倒计时计数器.最简单的是:int size = 5; ...

  2. 信管专业要学java吗_信管专业工作难 学习Java之后竟然这样

    原标题:信管专业工作难 学习Java之后竟然这样 陈同学,毕业于动力节点662班,大学学习的信息管理与信息系统专业,大学毕业一个月内没找到合适的工作,于是在大学同学的"牵线搭桥"下 ...

  3. Java学习笔记---多线程并发

    Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...

  4. 幼儿编程学java不_《终于有人说出来了——Java不适合于作为主要编程教学语言》我的看法...

    我就一些评论说说我的观点: 对文章,我觉得比较合理的,一开始上手java并不是很好的方法,对于文章中的建议值得大家思考. 两片文章是说 教育系统不应该不传授C语言,而直接学习JAVA,从而导致了... ...

  5. java 分析java死锁_有益的CountDownLatch和棘手的Java死锁

    java 分析java死锁 您是否曾经使用过java.util.concurrent.CountDownLatch ? 这是在两个或多个线程之间实现同步的非常方便的类,在该类中,一个或多个线程可以等待 ...

  6. java自动化_作为测试工程师进阶自动化选Java还是Python?

    这是很多测试工程师从功能跨入自动化纠结的问题,今天本文带大家一探究竟. Java和Python一直都是两种很火的语言,用Python的一定觉得Python好,用Java的只觉得Java好. Java语 ...

  7. aix系统java堆_浅谈AIX环境下的Java性能调优

    1.什么是Java Java 是一种面向对象的编程语言.它以 C++ 为模型,被设计成小的.简单的.在源和二进制级别跨平台的可移植的语言,Java 程序(applets 和应用程序)可以运行于任何已经 ...

  8. c语言不会可以学好java吗_不会C语言能学Java吗

    不会C语言能学Java吗?当然可以,学码思不少小伙伴没有任何代码基础,来这里Java培训学的也非常不错,都获得了理想的就业.现在时代不一样了,编程语言更新换代的速度也很快,很多老程序员都是从C语言入门 ...

  9. 安装java环境_(一)环境安装之Java

    安装java 点击 JDK8下载,根据自己的平台,选择相应的版本进行下载. 小知识: Java环境分JDK和JRE ,JDK就是Java Development Kit.简单的说JDK是面向开发人员使 ...

最新文章

  1. Redis 高级特性(5)— 集群模式(主从模式、哨兵模式、cluster 集群模式)
  2. word2vec原理(二):基于Hierarchical Softmax的模型
  3. C#LeetCode刷题之#206-反转链表(Reverse Linked List)
  4. while(scanf(%d,n)!=EOF) / while(cinn)终止问题
  5. UVA11764 Jumping Mario【Ad Hoc】
  6. Linux学习笔记--终端命令
  7. 小甲鱼python二_小甲鱼python第二讲课后习题
  8. 电商产品安全要求(UL+IEC)
  9. EXCEL下拉菜单怎么弄
  10. 链桨PaddleDTX系列 - xdb源码分析(一)
  11. 睡觉计算机主机在身旁好么,笔记本电脑的睡眠和休眠之间有什么区别
  12. 用Markdown画流程图
  13. 解决每次运行Xcode都需要输入密码问题
  14. 内存耗尽后Redis会发生什么
  15. EM算法原理和python简单实现
  16. 上传资源到静态服务器
  17. 东京奥运会完美收官,来看看这届奥运会都有哪些人工智能黑科技
  18. BGP在数据中心的应用5——BGP生命周期管理
  19. Ringbuff note
  20. 数据库误删了数据再也不用跑路了,

热门文章

  1. mysql查找附近算法_Java+MySQL实现附近功能
  2. journald.conf 中文手册
  3. HapiJS开发手册
  4. mysql从服务器能否修改数据,mysql数据库操作新手入门,手把手的教会你 _数据库教程...
  5. FFT的C语言实现,对照MATLIB
  6. 虚拟运营商APN、SPN参数、Sim卡名称
  7. 浏览器Goole Chrome调试工具
  8. LM2596的肖特基二极管选择的注意点
  9. 【内联函数】inline关键字的作用与内联函数的特性
  10. 对一个8位(一字节)数的倒序处理