CyclicBarrier(同步屏障)了解吗?

CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它的作用是让一组线程到达一个屏障(也可以称为同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。

CyclicBarrier和CountDownLatch类似,都可以协调多线程的结束动作,并在结束后执行特定的动作。但是CyclicBarrier和CountDownLatch有不同的地方。

让我们用一个故事来还原这个场景:故事的主人公是一个新晋UP主叫小约翰,他有两个大恨事——“想结衣结衣不依,迷爱理爱理不理。”接下来,我们来还原故事的经过:

小约翰刚开始成为UP主后,认识了一个叫新垣结衣的女生。于是,他决定第一次向结衣表白,并等待她的回应。然而,新垣结衣却选择嫁给了另外一个UP主叫星野源,让小约翰伤心不已。他发誓终身不娶,但突然他发现了另一个UP主叫铃木爱理。于是,小约翰决定进行第二次求爱,希望爱理能理睬他,并等待她的回应。

我们可以用代码来模拟这个故事的情节,发现使用CountDownLatch无法满足需求,因为CountDownLatch是一次性的,无法重复使用,而这里需要等待两次。然而,使用CyclicBarrier就可以实现,因为它可以重复使用。

以下是使用CyclicBarrier模拟故事情节的代码:

1.png

运行结果:

2.png

CyclicBarrier最最核心的方法,仍然是await():

  • 如果当前线程不是第一个到达屏障的话,它将会进入等待,直到其他线程都到达,除非发生被中断屏障被拆除屏障被重设等情况;

上面的例子抽象一下,本质上它的流程就是这样就是这样:

3.png

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题