1. 闭锁CountDownLatch

闭锁CountDownLatch用于线程间的同步,它可以使得一个或者多个线程等待其它线程中的某些操作完成。它有一个int类型的属性count,当某个线程调用CountDownLatch对象的await方法时,将会阻塞,直到count的值变成0;count值可以通过它的countDown的方法进行减1。 count的值在构造方法中进行指定。

注意count的值不可以重设,因此当count的值变成0后,CountDownLatch就不再起作用了,此时再调用它的await方法将会直接返回。也就是说,对它的重复使用是没有任何意义的。

它可以使用在以下场景:

当count的值为1时,可以作为一个开关,所有调用它的await方法的线程都一起等待,直到开关被某个其它线程打开;

当count的值为n时,可以使得一个或者多个线程等待其它n个线程完成了某些处理,或者某个线程执行了n次某项操作;

典型的用法如:将一个计算过程细分成n个子计算,主线程调用CountDownLatch的await方法等待子任务计算完成;而n个子线程处理每个子任务;当每个子任务执行完成后调用countDown方法。这样子任务计算完成时主线程就可以继续往下执行了。

注意:CountDownLatch本身是线程安全的,因此对它的方法的调用不需要再使用其它的同步机制。

1.1 示例

假设要主线程要等待其它一组线程执行完某个操作再继续执行,可以使用以下方式:

直接运行,执行结果如下:

可以看到:主线程调用latch.await方法后即等待;当所有被提交的Work作业执行完latch.countDown后,主线程继续执行,而不用等到所有子线程全部完成。

如果将latch.countDown()方法放在每个子线程的最后,那么就意味着主线程需要等待所有子线程执行完成了。这个时候就与线程池中使用Future中的get方法类似。

因此,在线程间的协作上,CountDownLatch可以进行更加精细的控制:某个线程可以依赖于其它线程执行部分后马上执行,而不用等待依赖的线程全部执行完成后再执行!

1.2 CountDownLatch方法说明

闭锁主要包含以下方法:

a. await() throws InterruptedException

如果count的值为0,那么该方法将直接返回;否则当前线程将会阻塞直到闭锁的count值变成0或者当前线程被中断。

b. boolean await(long timeout, TimeUnit unit) throws InterruptedException

如果count的值为0,那么该方法直接返回,否则将会阻塞直到闭锁的count变成0或者当前线程被中断或者超时时间到;当count变成0时返回True;否则如果超时时间到且未变成0则返回False。

c. countDown()

如果当前值已经是0则不会做任何事情; 否则将count的值减1;如果新值变成0的时候将会唤醒所有等待的线程;

d. long getCount()

返回当前的count值。

2.栅栏CyclicBarrier

栅栏是一种多线程之间的同步机制,它允许多个线程等待彼此直到每个线程都到达某个位置。它的名称中含有cyclic是因为它可以重复使用。

如:有一张门有N把钥匙,需要N把钥匙组合到一起才能开门,大家商量好同时从不同地方向那张门赶去,先到的人必须要等待所有人都到达后才能打开门并进入。

2.1 使用示例

执行结果:

从结果中可以看出:直到三个线程都打印了第一条消息后,所有线程才继续执行。

注意:通过构造函数,可以传入需要等待的参与者个数。如果调用await的线程达到参与者个数,那么所有的参与者都会继续往下执行;即使参与者个数大于指定的个数。

2.2CyclicBarrier的使用

主要是await与reset方法

a. await

阻塞当前线程,直到等待所有的参与者线程都调用了这个方法。当被中断时抛出对应异常。它也可以指定超时时间,在超时时间到后直接返回。

b. reset

重置栅栏到初始化状态,使得它可以继续被使用。

3.栅栏与闭锁的区别

经过以上分析,栅栏与闭锁主要有以下区别:

闭锁不可以重复使用,而栅栏提供了reset方法,可以重复使用。

使用场景上:闭锁主要使用在一个或者多个线程等待某个条件的发生,这个条件一般是由其它非等待线程来进行更新;而栅栏多个线程等待的条件就是这些线程都运行到某个位置,而不能由这些线程以外的其它线程来进行控制。

注意实际上除了重复使用外,闭锁也可以使用在栅栏的场景中,每个线程在调用闭锁的await方法前都先调用countDown(),那与直接调用栅栏的await方法可以达到同样的效果。

java 栅栏_Java并发基础-栅栏(CountDownLatch)与闭锁(CyclicBarrier)相关推荐

  1. JAVA多线程和并发基础面试问答(转载)

    JAVA多线程和并发基础面试问答 原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-ans ...

  2. java 栅栏_Java 并发工具类(栅栏 CyclicBarrier )

    CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行地执行工作,然后在下一个步骤之前等待,直到所有任务都完成.栅栏和闭锁的关键区别在于,所有线程必须同时到达栅栏位置,才能继续执行. ...

  3. ***JAVA多线程和并发基础面试问答

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观 ...

  4. java线程栅栏_Java 多线程基础 - CyclicBarrier

    我的博客 转载请注明原创出处. 序 java.util.concurrent包里有几个能帮助人们管理相互合作的线程集的类,为多线程常见的应用场景预置了抽象好的类库.在遇到这些应用场景时应该直接重用合适 ...

  5. java 并发 面试_Java 并发基础常见面试题总结

    1. 什么是线程和进程? 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启 ...

  6. java动态同步_java并发基础-Synchronized

    基础使用 基本上Java程序员都简单的了解synchronized的使用: 无非就是用在多线程环境下的同步. 看如下简单的例子: publicclassUnsafeCounter{ privatein ...

  7. java 线程假醒_Java并发基础05. 传统线程同步通信技术

    先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首 ...

  8. java 多线程共享变量两类问题_Java并发基础09. 多个线程间共享数据问题

    先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作 ...

  9. JAVA多线程和并发基础面试问答

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在 ...

  10. JAVA多线程和并发基础面试题

    多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一.在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应日后碰到的问题.(校对注:非常赞同这个观 ...

最新文章

  1. Python D6 if分支结构
  2. vertx.FileResolver文件解析
  3. php stripslashes 去除反斜线
  4. ipconfig和ping 命令的各种参数
  5. springboot-web进阶(三)——统一异常处理
  6. Google地图更新,更AI更贴心更节约时间,就是不敢来中国
  7. 【iOS】UIViewController、UINavigationController与UITabBarController的整合使用
  8. elasticsearch(七)java 搜索功能Search Request的介绍与使用
  9. 【Kubernets】——搭建k8s多节点集群
  10. html5手机静态页面,html手机端WEB纯静态页面
  11. WhatsApp营销工具有哪些?
  12. 利用Matlab实现单像空间后方交会
  13. Idea中发布JAR包到中央仓库报错问题处理 unable to find valid certification path to requested target
  14. 免费的静态网页托管_如何使用自动管道免费托管静态站点
  15. qt服务器项目总结报告,ea项目总结报告-20210805131110.docx-原创力文档
  16. 我可能永远也没办法成为全栈工程师了,看看你还差多少?
  17. win10远程计算机或设备将不接受连接
  18. Oracle - java连接Oracle
  19. 完成我的第一个java项目“评标人才库管理系统”——环境配置+创项目
  20. 用ubuntu读取U盘时,电脑蓝屏自动重启的问题

热门文章

  1. 《东周列国志》第十二回 卫宣公筑台纳媳 高渠弥乘间易君
  2. 手披云雾开鸿蒙,赞美泰山的诗句
  3. 手把手教你编译Flutter engine
  4. 美团点评 2019校园招聘 后台开发方向
  5. iphone,ipad 尺寸,iphone常用控件尺寸
  6. RSA的APT峰会会议纪要
  7. 大O记法-BigO notation
  8. 【图论·习题】同余最短路:跳楼机
  9. windows server 2008 web服务器搭建
  10. 论文阅读 (54):DeepFool: A Simple and Accurate Method to Fool Deep Neural Networks