允许一组线程全部等待彼此达到共同屏障点的同步辅助。就像跑步比赛,等所有运动员都到达终点,才把成绩给报上去。
独占锁

源码分析

await()

所有的线程到这儿就暂停等待,等所有的线程都执行到这儿之后,才能执行下面的操作。
如果当前线程不是最后一个线程,那么它被禁用以进行线程调度,并且处于休眠状态,知道发生下列事情之一:

  • 最后一个线程到达
  • 一些其他线程当前线程为interrupt
  • 一些其他线程interrupt其他等待线程之一
  • 一些其他线程在等待屏障时超时
  • 其他一些线程在这个屏障上调用reset()

使用场景

单元测试并发的时候,可以使用该类。

  1. static AtomicInteger i = new AtomicInteger(0);
  2. public static void main(String[] args) {
  3. CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
  4. for ( int i = 0; i < 30; i++) {
  5. new Thread(() -> {
  6. try{
  7. cyclicBarrier.await();
  8. print();
  9. }catch(Exception e){
  10. }
  11. }).start();
  12. }
  13. }
  14. private static void print(){
  15. if(i.getAndIncrement() % 2 ==0){
  16. System.out.println("do task...");
  17. }else {
  18. System.out.println("sleep...");
  19. }
  20. }