JAVA 并发编程-线程同步工具类(十二)
本文主要介绍一些java线程同步工具类,并不进行详细解说。当有须要时。能够再去结合实例学习。
信号灯(Semaphore)
应用场景举例:
比如公司的打卡系统。假设有一个打卡机,那么一次就仅仅能有一个人打卡,其余的人就被堵塞住。打卡完以后就可由下一个人打卡。假设有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
总结:
以上都是一些线程的同步工具类。它们各有各的应用场景,在并发编程中。我们能够应用这些工具来更好的实现我们的业务需求。