Java 中 CountDownLatch 和 CyclicBarrier 有什么不同?

本是古典 何须时尚 2023-10-01 11:38 77阅读 0赞

以下都是Java的基础面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub在这里整理这些容易忘记的重点知识及解答建议收藏,经常温习查阅

文章目录

      1. Java 中 CountDownLatch 和 CyclicBarrier 有什么不同?
    • 10道不得不会的Java基础面试题

7. Java 中 CountDownLatch 和 CyclicBarrier 有什么不同?

概念:

CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。简单来说:CountDownLatch 是一个计数器,可以保证线程之间的顺序执行把线程从并发状态调整为串行状态保证了线程的执行顺序。(只可以使用一次)

CyclicBarrier 是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。典型场景:可以用于多线程计算数据,最后合并计算结果。(可以多次使用)

分享一个直观的代码:

  1. package com.javapub.test;
  2. import java.util.concurrent.CountDownLatch;
  3. /**
  4. * @Author: JavaPub
  5. * @License: https://github.com/Rodert/
  6. * @Contact: https://javapub.blog.csdn.net/
  7. * @Date: 2022/1/1 16:50
  8. * @Version: 1.0
  9. * @Description: countDownLatch 可以保证线程之间的顺序执行把线程从并发状态调整为串行状态保证了线程的执行顺序。
  10. * demo效果:当打印完B,再打印C。
  11. */
  12. class ThreadA extends Thread {
  13. private CountDownLatch down;
  14. public ThreadA(CountDownLatch down) {
  15. this.down = down;
  16. }
  17. @Override
  18. public void run() {
  19. System.out.println("A");
  20. try {
  21. down.await();//相当于wait(),调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
  22. } catch (InterruptedException e) {
  23. e.printStackTrace();
  24. }
  25. System.out.println("C");
  26. }
  27. }
  28. class ThreadB extends Thread {
  29. private CountDownLatch down;
  30. public ThreadB(CountDownLatch down) {
  31. this.down = down;
  32. }
  33. @Override
  34. public void run() {
  35. System.out.println("B");
  36. System.out.println(down.getCount());
  37. down.countDown();//将count值减1
  38. }
  39. }
  40. public class Test {
  41. public static void main(String[] args) {
  42. CountDownLatch down = new CountDownLatch(1);//创建1个计数器
  43. new ThreadA(down).start();
  44. new ThreadB(down).start();
  45. }
  46. }
  47. /*输出
  48. A
  49. B
  50. C
  51. */
  52. package com.roundyuan.fanggateway.test;
  53. import java.util.concurrent.CyclicBarrier;
  54. /**
  55. * @Author: JavaPub
  56. * @License: https://github.com/Rodert/
  57. * @Contact: https://javapub.blog.csdn.net/
  58. * @Date: 2022/1/2 13:42
  59. * @Version: 1.0
  60. * @Description: CyclicBarrier
  61. */
  62. public class CyclicBarrierDemo {
  63. static class TaskThread extends Thread {
  64. CyclicBarrier barrier;
  65. public TaskThread(CyclicBarrier barrier) {
  66. this.barrier = barrier;
  67. }
  68. @Override
  69. public void run() {
  70. try {
  71. Thread.sleep(1000);
  72. System.out.println(getName() + " 到达栅栏 A");
  73. barrier.await();
  74. System.out.println(getName() + " 冲破栅栏 A");
  75. Thread.sleep(2000);
  76. System.out.println(getName() + " 到达栅栏 B");
  77. barrier.await();
  78. System.out.println(getName() + " 冲破栅栏 B");
  79. } catch (Exception e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. }
  84. public static void main(String[] args) {
  85. int threadNum = 5;
  86. CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
  87. @Override
  88. public void run() {
  89. System.out.println(Thread.currentThread().getName() + " 完成最后任务");
  90. }
  91. });
  92. for (int i = 0; i < threadNum; i++) {
  93. new TaskThread(barrier).start();
  94. }
  95. }
  96. }
  97. /*
  98. Thread-3 到达栅栏 A
  99. Thread-1 到达栅栏 A
  100. Thread-4 到达栅栏 A
  101. Thread-2 到达栅栏 A
  102. Thread-0 到达栅栏 A
  103. Thread-2 完成最后任务
  104. Thread-2 冲破栅栏 A
  105. Thread-0 冲破栅栏 A
  106. Thread-4 冲破栅栏 A
  107. Thread-3 冲破栅栏 A
  108. Thread-1 冲破栅栏 A
  109. Thread-4 到达栅栏 B
  110. Thread-0 到达栅栏 B
  111. Thread-2 到达栅栏 B
  112. Thread-1 到达栅栏 B
  113. Thread-3 到达栅栏 B
  114. Thread-3 完成最后任务
  115. Thread-3 冲破栅栏 B
  116. Thread-0 冲破栅栏 B
  117. Thread-4 冲破栅栏 B
  118. Thread-1 冲破栅栏 B
  119. Thread-2 冲破栅栏 B
  120. */

网上看到一个比较形象一个例子:

  1. CountDownLatch
  2. 宿管阿姨,晚上关宿舍大门睡觉,需要等到所有学生回寝,才能关门睡觉,学生之间不用相互等待,回寝就能睡觉。 (学生就是各个线程,宿管阿姨就是监听CountDownLatch0后要执行的。)
  3. CyclicBarrier
  4. 家庭聚餐,等待家庭成员到齐才能开饭,家庭成员之间需要相互等待,直到最后一个到达,才能同时开饭。

10道不得不会的Java基础面试题

https://javapub.blog.csdn.net/article/details/122011870

手机随时看:微信搜【JavaPub】 JavaPub

查看更多面试题及答案
wx

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读