CyclicBarrier源码详解(JDK1.8)

CyclicBarrier常用于实现多个线程之间相互等待的功能,而且是可重置的,灵活性要强于CountDownLatch

1- 重要字段

CyclicBarrier源码详解(JDK1.8)_第1张图片

2- 构造方法

CyclicBarrier源码详解(JDK1.8)_第2张图片

3- 屏障前等待的主方法 dowait

CyclicBarrier源码详解(JDK1.8)_第3张图片

CyclicBarrier源码详解(JDK1.8)_第4张图片


所有party通过调用await方法进行dowait方法内:

  1. 先获得重入锁
  2. 检查状态,可能抛出异常
  3. count自减1, 判断是否是最后一个到达屏障的party,如果是则执行command,并重置generation,count,唤醒所有等待的parties,最后返回。
  4. 如果还不能越过屏障则死循环等待(trip.await方法),并释放锁,直到最后一个到达的party通知、屏障被破坏、中断、超时的发生。
  5. 被唤醒后重新获取锁,获取成功后检查CyclicBarrier是否被破坏,是否发生中断、超时等,根据情况抛出异常并设置屏障的状态,唤醒等待的线程。
  6. 最后释放锁。

4- 其他private方法

CyclicBarrier源码详解(JDK1.8)_第5张图片

这两个方法都会更新CyclicBarrier的状态和唤醒等待的线程:越过屏障则调用nextGeneration()方法,当发生中断、超时、reset()重置CyclicBarrier则调用breakBarrier()方法

5- await方法

CyclicBarrier源码详解(JDK1.8)_第6张图片

6- 查询操作

查询操作都需要获取锁


CyclicBarrier源码详解(JDK1.8)_第7张图片

7- 总结

  1. 当发生中断、超时都会破坏Barrier,使得当前generation失效,唤醒所有等待的线程,只能通过reset方法才能修复屏障。

  2. 查询操作是通过获取重入锁来保证实时性的。

  3. 通过condition来阻塞唤醒线程。

你可能感兴趣的:(CyclicBarrier源码详解(JDK1.8))