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

 

总结:

 

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

 

 


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值