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

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

倒计时器场景

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

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

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

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

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

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

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

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

使用count—的代码实现

模拟不同部门的线程:

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

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

模拟总控室的主线程: