Javajava专题Java技术专题

闭锁(Latch)实现 CountDownLatch 和 栅栏

2019-05-15  本文已影响3人  entro

闭锁(Latch)实现 CountDownLatch 和 栅栏 CyclicBarrier

闭锁 CountDownLatch 是一个主线程等待多个子线程。
栅栏 CyclicBarrier 是多个线程相互等待,只要一个没完成,所有线程都等待。

一、闭锁实现 CountDownLatch

CountDownLatch是一个同步工具类,是一种灵活的闭锁实现。位于concurrent包(jdk1.5引入)下。
常用的ConcurrentHashMap、BlockingQueue、CyclicBarrier(栅栏)也位于该包下。

CountDownLatch的主要作用 等待结束 同时开始

  1. 等待结束:使一个线程等待其他线程完成各自的工作后再执行,即并发场景中的等待结束(5种常见的并发场景)。
  2. 同时开始(实现最大的并行性):还有另外一种变形应用:把计数器初始值设为1,多个线程调用await()方法,可以实现并发场景中的同时开始

CountDownLatch的实现原理

CountDownLatch是一个灵活的闭锁实现,包含一个计数器,初始值是线程数量(需要等待的事件个数)在构造函数中设置。每个线程执行完后就减一。
await方法等待计数器到达0,表示所有需要等待的事件都已经完成,然后继续执行当前线程。

二、栅栏 CyclicBarrier

顾名思义:可循环(Cyclic)的屏障(Barrier)。让一组线程到达一个栅栏屏障都被阻塞,直到最后一个线程到达。
CyclicBarrier的构造方法CyclicBarrier(int parties)的参数parties表示屏障拦截的线程数量。
线程调用await()方法告诉CyclicBarrier我已到达屏障。然后阻塞当前线程。

CyclicBarrier还提供了另一个构造方法 CyclicBarrier(int parties, Runnable barrierAction)
用于在线程到达屏障时,优先执行barrierAction这个Runnable对象,用来处理稍微复杂的业务场景。

三、CountDownLatch和CyclicBarrier常见的几个面试题

  1. CountDownLatch的概念?
    CountDownLatch内部使用几个计数器,初始大小为要等待线程的个数,每个线程执行完毕,计数器减一。最终计数器等于0时唤醒主线程。
  2. CountDownLatch和CyclicBarrier的区别?
    CyclicBarrier是多个线程同时等待,一个没完,所有等待。
  3. CountDownLatch的主要方法及使用场景?
    主要方法await()countDown(),使用在等待开始和同时开始等场景下。
上一篇下一篇

猜你喜欢

热点阅读