我所理解的CountDownLatch和CyclicBarrier

be-thinking 2018-07-11 原文

我所理解的CountDownLatch和CyclicBarrier

         晚上打车回家,在车上看到一篇文章《22岁大学生获谷歌天价Offer,年薪千万!》,讲的是印度一个22岁大学生多次参加ACM大赛,开源多个项目,以非常牛逼的履历通过了谷歌的AI测试,斩获谷歌仅有的50个顶尖offer之一。于是感慨:同样是大学生,为何这哥们就这么一枝独秀呢?难道印度也有陈独秀?为啥自己都12年义务教育+4年大学教育+3年烟酒僧教育了,连人家个零头都挣不了啊?真恨不得在地上挖个洞钻进去。不行,今晚必须输出篇博客安慰下被打击的心!想到这里顿时酒也醒了(老大走了,今晚几个同事送他,喝了点酒),心也不再那么伤感了,决定把今天get的一些知识点做个梳理,知识是一点点积累起来的,比你牛逼的人比你还努力,你还有什么资格不努力?

        早上看了下CountDownLatch和CyclicBarrier的用法和区别,就来讲讲这2兄弟的功能&&特点&&用法,讲的不对的地方欢迎指正。

              CountDownLatch:

                        功能:同步辅助类,也可以理解为倒计时锁,用于同步线程状态,允许一个或多个线程,等待其他一组线程完成操作,再继续往下执行。

                        特点:不可复用!

                        重要方法:countDown()方法:计数器-1,每次线程执行完后调用;await()方法:等待方法,在需要阻塞的地方调用,当所有线程都执行完后,自动往下执行

                        用法:构造的时候指定一个计数器的值,每个线程执行完后就减1,直到为0再往下走。如下:

                                  

                                 输出结果:

                                 

                                 可以看到:2个子线程分别睡眠了3s和5s,而主线的打印的“所有现场执行完毕”却是在所有子线程执行完成后才输出的,原因就是阻塞在了latch.await()方法,这个方法会等到所有线程都执行完才往下执行,阻塞的原理后面有空再研究分析

          CyclicBarrier(循环栅栏):

                        功能:同步辅助类,功能和CountDownLatch类似,用于同步线程状态,允许一组线程相互之间等待,达到一个共同点,再继续执行。

                        特点:可复用!当所有线程都

                        重要方法:await()方法:当某个线程到达某个点(比如执行完某个任务)后调用该方法,就会等待其他线程,直到所有线程都到达这个点,再自动往下执行。还有个重载方法await(long timeOut,TimeUnit unit),用于当某个线程执行超过指定时间后还未到达某个点时,就会抛出异常,不再等待这个线程,并往下执行

                        用法:构造的时候指定一个线程数量的值和到达某个点后执行的动作,如下:

                                   

                            执行结果如下:

                                   

                            可以看到:当前线程先于2个子线程打印执行结果,原因就是CyclicBarrier针对的是一组线程之间的等待,await方法会等待该组内所有线程都执行完毕再往下执行,Runnable接口里定义的动作是在所有线程执行完毕后,随机选择一个线程来执行

          2者区别:

                        1、CountDownLatch不可复用,当计数器减为0后,只能重新构造新的计数器,CyclicBarrier可以复用,当所有线程都到

                        2、CyclicBarrier针对的是一组线程之间的等待,是组内等待关系,CountDownLatch针对的是一个线程等待别的一组线程的关系,是组间等待关系

           本来还想讲讲volatile关键字的原理和特性,以及activeMQ中quene,topic和virtualTop之间的区别和用法的,以及mysql索引结构的实现原理的,时间不够了,明早还要去申请廉租房得早起,下次再讲吧。

         

发表于 2018-07-11 00:34 曦阳x 阅读() 评论() 编辑 收藏

 

版权声明:本文为be-thinking原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/be-thinking/p/9292290.html

我所理解的CountDownLatch和CyclicBarrier的更多相关文章

  1. Redis 6.0 新特性:带你 100% 掌握多线程模型

    Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注。 码老 […]...

  2. CAS你知道吗?底层如何实现?ABA问题又是什么?关于这些你知道答案吗

    CAS你知道吗?如何实现? 1. compareAndSet 在volatile当中我们提到,volatile […]...

  3. Java多线程-线程池的使用

    目录 线程池的优点 线程池的实现原理 池化技术 Java中的实现 官方接口 ThreadPoolExecuto […]...

  4. AbstractQueuedSynchronizer 原理分析 – 独占/共享模式

    1.简介 AbstractQueuedSynchronizer (抽象队列同步器,以下简称 AQS)出现在 J […]...

  5. Java并发编程实战(4)- 死锁

    在这篇文章中,我们主要讨论一下死锁及其解决办法。 在这篇文章中,我们主要讨论一下死锁及其解决办法。 目录 概述 […]...

  6. 多线程具体实现

    目录 Java内存模型 线程同步 锁概述 锁的作用 锁的相关概念 可重入性:一个线程持有该锁的时候能够再次/多 […]...

  7. C++ concurrency in action 读随记1

    C++ concurrency in action 读随记1   翻了翻,感觉标准库支持的并发应该是kerne […]...

  8. 并发编程之:线程池(一)

    大家好,我是小黑,一个在互联网苟且偷生的农民工。 池化 线程池是在计算机开发中常见的一种池化技术,是为了提高资 […]...

随机推荐

  1. POJ 1065 & ZOJ 1025

    #include <cstdio> #include <iostream> #incl […]...

  2. SSD硬盘 全盘安全擦除

    SSD硬盘 全盘安全擦除 2016-04-04 11:56  ☀宝宝合凤凰☀  阅读(5046)  评论(0) […]...

  3. 从微信小程序到鸿蒙js开发【08】——表单组件&注册登录模块

    目录: 1、登录模块 2、注册模块 3、系列文章导读 牛年将至,祝大家行行无bug,页页so easy~ 在微 […]...

  4. 在Oracle下创建数据库,连接数据库

    打开Windows命令控制台,或者WIN+R打开运行对话框 输入dbca 回车 就会打开数据库创建的配置对话框 […]...

  5. Qps从300到1500的优化过程

    最近压测一项目,遇到的性能问题比较典型,过程记录下来,给大家做定位调优参考; 表象: 单接口负载测试,qps最 […]...

  6. Hadoop体系架构简介

      今天跟一个朋友在讨论hadoop体系架构,从当下流行的Hadoop+HDFS+MapReduce+Hbas […]...

  7. 租房的人看看,一个租房评价的小程序

    我一直有一个简单的想法 当前中国租房市场如此的庞大,各大租房市场提供了详细的租房服务,却没有为用户提供一个很好 […]...

  8. Redis 的底层数据结构(压缩列表)

    上一篇我们介绍了 redis 中的整数集合这种数据结构的实现,也谈到了,引入这种数据结构的一个很大的原因就是, […]...

展开目录

目录导航