JAVA 并发编程-线程同步工具类(十二) 信号灯(Semaphore) 障碍器(CyclicBarrier) 同步计数器(countDownLatch) 线程间数据交换(Exchanger) 总结:


本文主要介绍一些java线程同步工具类,并不进行详细解说。当有须要时。能够再去结合实例学习。

 

 

应用场景举例:

 

比如公司的打卡系统。假设有一个打卡机,那么一次就仅仅能有一个人打卡,其余的人就被堵塞住。打卡完以后就可由下一个人打卡。假设有3个打卡机。那么一次就同意3个人或者少于三个人打卡,其余的人就得等待打卡机空暇下来才干继续打卡。

 

结果:

 

已进入1个线程,还可进入2个

已进入2个线程,还可进入1个

已进入3个线程。还可进入0个

空余出1个

已进入4个线程。还可进入0个

已进入6个线程。还可进入0个

空余出0个

空余出1个

已进入5个线程,还可进入0个

空余出0个

已进入8个线程,还可进入0个

空余出1个

已进入7个线程。还可进入0个

已进入9个线程,还可进入0个

空余出0个

空余出1个

空余出3个

空余出3个

从打印结果能够看出,尽管一次可进入三个线程。但并非要等三个线程所有空出来才干够进入其它线程。

而是仅仅要有一个空暇,等待的线程立马补上。这和现实生活中的情景式多么类似阿。

由此可见,信号灯用来控制线程是非常人性化的。

 

 

障碍器(CyclicBarrier)

 

应用场景举例:

 

举个样例比方说公司接到一个项目(主线程),一部分人开发前台(线程1)。一部分人开发后台(线程2),前台和后台不可能同一时候开发完毕,可是仅仅有前台和后台都开发完毕了,才干提交给客户。那么,CyclicBarrier所实现的就是对已完毕任务的线程进行堵塞的功能。

 

结果:

前台正在开发!

后台正在开发。

前台开发完毕

后台开发完毕

两个项目组都已开发完毕,进行測试。

測试通过,交付给客户

 

synchroized、Lock、Semaphroe都是对线程执行開始进行控制,而CyclicBarrier是对线程的完毕进行控制

 

同步计数器(countDownLatch)

 

应用场景举例:

 

作用是在完毕一组正在其它线程中执行的操作之前。它同意一个或多个线程一直等待。

结果:

准备開始!

运动员7号到达终点!

运动员9号到达终点!

运动员6号到达终点!

运动员1号到达终点!

运动员3号到达终点!

运动员4号到达终点!

运动员0号到达终点!

运动员8号到达终点!

运动员2号到达终点!

运动员5号到达终点!

结束!

 

对照障碍器(CyclicBarrier)来说,障碍器仅仅能控制线程的结束。

可是计数器(CountDownLatch)能够通过多个计数器组合运用。既能够控制线程的開始,又能够控制线程的结束。

 

 

线程间数据交换(Exchanger)

 

应用场景举例:

 

所实现的功能是线程间的数据交换。可是须要注意的是,仅仅能是两个线程的数据交换。

 

结果:

 

许阳拥有五元钱

商店拥有beverage

開始交易......

商店得到:五元钱

许阳得到beverage

 

总结:

 

    以上都是一些线程的同步工具类。它们各有各的应用场景,在并发编程中。我们能够应用这些工具来更好的实现我们的业务需求。