CyclicBarrier 源码分析

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

实现原理:

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

CyclicBarrier 和 CountDownLatch 的不同点:

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

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

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

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

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

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

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

你可能感兴趣的:(CyclicBarrier,多线程)