CyclicBarrier常用于实现多个线程之间相互等待的功能,而且是可重置的,灵活性要强于CountDownLatch
1- 重要字段
2- 构造方法
3- 屏障前等待的主方法 dowait
所有party通过调用await方法进行dowait方法内:
- 先获得重入锁
- 检查状态,可能抛出异常
- count自减1, 判断是否是最后一个到达屏障的party,如果是则执行command,并重置generation,count,唤醒所有等待的parties,最后返回。
- 如果还不能越过屏障则死循环等待(trip.await方法),并释放锁,直到最后一个到达的party通知、屏障被破坏、中断、超时的发生。
- 被唤醒后重新获取锁,获取成功后检查CyclicBarrier是否被破坏,是否发生中断、超时等,根据情况抛出异常并设置屏障的状态,唤醒等待的线程。
- 最后释放锁。
4- 其他private方法
这两个方法都会更新CyclicBarrier的状态和唤醒等待的线程:越过屏障则调用nextGeneration()方法,当发生中断、超时、reset()重置CyclicBarrier则调用breakBarrier()方法
5- await方法
6- 查询操作
查询操作都需要获取锁
7- 总结
当发生中断、超时都会破坏Barrier,使得当前generation失效,唤醒所有等待的线程,只能通过reset方法才能修复屏障。
查询操作是通过获取重入锁来保证实时性的。
通过condition来阻塞唤醒线程。
祝贺暗组重新回来,本人发的文章只是充个数,并非原创。