天天看点

聊聊并发(三)——同步辅助类

  JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过多时 Lock 锁的频繁操作。这三种辅助类为:

  CountDownLatch:减少计数。减一计数器。

  CyclicBarrier:循环栅栏。加一计数器。

  Semaphore:信号灯。

  脑图:https://www.processon.com/view/link/61849ba4f346fb2ecc4546e5

  场景一:6 个同学陆续离开教室后,班长才可以关门。

  代码示例:

  场景二:田径运动会上,起跑前所有运动员等待裁判发枪声为准开始比赛。典型的多个线程等待一个线程。

  场景三:田径运动会上,终点处,计时裁判需要等待所有运动员到达终点,才能宣布本次比赛结束。典型的一个线程等待多个线程。

  每执行 CyclicBarrier 一次障碍数会加一,如果达到了目标障碍数,才会执行目标方法。可以将 CyclicBarrier 理解为加一计数器。

  一个计数信号量。在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。每个release()添加许可证,潜在地释放阻塞获取方。但是,没有使用实际的许可证对象。Semaphore只保留可用数量的计数,并相应地执行。使用 acquire() 方法获得许可证,release() 方法释放许可。

  理解:就是多个线程一起抢多把锁。

  代码示例:6辆车抢2个车位

  这里,Semaphore的构造器参数是2,表示有2个许可证。所以,可以同时停下2辆车。结果不难分析。

  参考文档:https://www.matools.com/api/java8

作者:Craftsman-L

出处:https://www.cnblogs.com/originator

本博客所有文章仅用于学习、研究和交流目的,版权归作者所有,欢迎非商业性质转载。

如果本篇博客给您带来帮助,请作者喝杯咖啡吧!点击下面打赏,您的支持是我最大的动力!