欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CyclicBarrier 源码分析

程序员文章站 2022-04-20 16:38:31
...
简介:
CyclicBarrier 实现这么一个功能,比如说吃饭,是不是要等所有人到齐了才能开始吃?CyclicBarrier 就实现了这么一个功能. 所有的线程都互相等待着,等所有的线程到达后,然后执行. CyclicBarrier 还可以实现这么一个功能,当所有人(线程)到齐后,可以先叫服务员上菜,然后所有人再开始吃.

实现原理:

使用 ReentrantLock.condition 实现的. 来一个线程,判断 count 自减后是否等于 0 ,不等于 0 ,则调用 wait 方法自我阻塞,等于 0 ,先执行传入的 runnable 线程,然后唤醒所有的线程.

CyclicBarrier 和 CountDownLatch 的不同点:

CountDownLatch 有两种角色,可以这么理解:比如要计算全班高数、线代、英语的平均成绩和三门课的平均成绩,我们该怎么做了?

思路一:用一个线程,先算高数平均成绩、再算线代平均成绩,最后算英语平均成绩,最后算这三门课的平均成绩.

但是思路一太慢了,我们是不是可以使用多线程来解决这个问题了?

用一个线程算高数的平均成绩,用一个线程算线代的平均成绩,再用一个线程计算英语的平均成绩. 最后再用一个线程计算这三门课的平均成绩.

但是如果保证所有课的平均成绩是在得出三门课的平均成绩了?

这时候就可以使用 CountDownLatch 了. 所以 CountDownLatch 中的两种角色:一个是计算单门课的平均成绩,另一个角色是计算所有课的平均成绩.

CyclicBarrier 就只有一种角色了,就是计算单门课的平均成绩.