常用的线程同步工具

在java.util.concurrent包下有很多线程相关的类,其中CountDownLatch、CyclicBarrier、Semaphore算是比较常用的,其它的还有Phaser、Exchanger…等等。

只是几个工具类的简单使用,原理请大家自行搜索。

CountDownLatch

定义是允许一个或多个线程一直等待,直到其他线程完成他们的操作,其再继续执行。
常用API : await()、countDown();

举个例子(可能不太恰当):
麻将铺老板,现在他铺子里有4个人在打麻将,

CountDownLatch countDownLatch = new CountDownLatch(4);//4个人

然后老板想关门睡觉了,但是不行啊,得等着4个人都走了才可以,所以就等啊等…

countDownLatch.await();// 老板在这儿一直等

然后他们终于打完了,准备走了,但是走之前还得干点事儿.。

等4个人都走完了,老板终于可以关门睡觉了。

 countDownLatch.await();
 System.out.println("老板终于可以关门睡觉了");

在这里插入图片描述
这就是一个人(线程)等待多个人(线程)执行结束,然后这个人再开始执行

再看一个 多个人(线程)等待一个人(线程)的例子:
4个人要打麻将,走到麻将馆结果老板刚起床,都得在门口等着老板开门。
在这里插入图片描述

CyclicBarrier

定义:允许一组线程互相等待,直到到达某个公共屏障点,CyclicBarrier注重的是:当线程到达某个状态后,暂停下来等待其他线程,所有线程均到达以后,继续执行。
主要API:await()
示例:
一群4个人去爬山,各自往上爬,约定先到第一站的在那儿等,等到所有人都到了第一站再各自继续往第二站出发,到了第二站还是在那儿等,等所有人都到了第二站再做后续的事情…

在这里插入图片描述

Semaphore

可以控制同时访问的线程个数,它维护了一组许可证
主要API:acquire()、release()
例子:
某公司为了防止员工带薪拉si,所以对厕所进行了改造,最多只能同时供5人使用厕所,每次使用厕所需要提前在前台小姐姐哪儿领牌子,有牌子才能进厕所,否则填个上厕所申请然后就在工位上待着,上完厕所后要把牌子还给小姐姐,有空的牌子后,小姐姐会来叫你。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值