跟着大神学Java并发原理JDK源码剖析之同步工具类CyclicBarrier
发布时间:2024-12-26 21:02 浏览量:7
CyclicBarrier使用场景
CyclicBarrier使用代码也很简单,如下所示。
考虑这样一个场景:10个工程师一起来公司应聘,招聘方式分为笔试和面试。首先,要等人到齐后,开始笔试;笔试结束之后,再一起参加面试。把10个人看作10个线程,10个线程之间的同步过程如图4-5所示。
图4-5 10个线程之间的同步过程
在整个过程中,有2个同步点:第1个同步点,要等所有应聘者都到达公司,再一起开始笔试;第2个同步点,要等所有应聘者都结束笔试,之后一起进入面试环节。具体到每个线程的run方法中,就是下面的伪代码:
CyclicBarrier基于ReentrantLock+Condition实现。
下面详细介绍 CyclicBarrier 的实现原理。先从构造函数说起,可以看到,不仅可以传入参与方的总数量,还可以传入一个回调函数。当所有的线程被唤醒时,barrierAction被执行。
接下来看一下await函数的实现过程。
关于上面的函数,有几点说明:
(1)CyclicBarrier是可以被重用的。以上一节的应聘场景为例,来了10个线程,这10个线程互相等待,到齐后一起被唤醒,各自执行接下来的逻辑;然后,这10个线程继续互相等待,到齐后再一起被唤醒。每一轮被称为一个Generation,就是一次同步点。
(2)CyclicBarrier 会响应中断。10 个线程没有到齐,如果有线程收到了中断信号,所有阻塞的线程也会被唤醒,就是上面的breakBarrier函数。然后count被重置为初始值(parties),重新开始。
(3)上面的回调函数,barrierAction只会被第10个线程执行1次(在唤醒其他9个线程之前),而不是10个线程每个都执行1次。