CountdownLatch和CyclicBarrier的区别

底层都是ReentrantLock,再底层实际上是CAS,AutomicXXX的一种体现形式

CountDownLatch是预先设一个值,然后减去,到0的时候await执行。
circle是预设一个目标值,到达目标值本身执行。

不多说直接案例:
运动大会:跑步比赛
运动员在入场就位过程中是CountDownLatch,待所有运动员就位,信号员信号枪装填弹药。

CyclicBarrier
裁判向所有运动员询问are you ready?
CyclicBarrier.await()全部准备完毕,同时起跑。

public static void prepare() throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 6; i++) {
new Thread(new Runnable() {
@Override
public void run() {
countDownLatch.countDown();
System.out.println(“运动员入参”+Thread.currentThread().getName() + " : " + countDownLatch.getCount());
}
}).start();

    }

    countDownLatch.await();
    System.out.println("z装填弹药:"+Thread.currentThread().getName() + " : " + countDownLatch.getCount());

}

public  static void run() {
    CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
    for (int i = 0; i < 5; i++) {


        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    System.out.println(Thread.currentThread().getName() + " 就位"+cyclicBarrier.getParties());

                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                } catch (BrokenBarrierException e) {
                    throw new RuntimeException(e);
                }
                System.out.println(Thread.currentThread().getName() + " 开炮 " );

            }
        }).start();


    }
    System.out.println(Thread.currentThread().getName() + " 跑步开始 " + cyclicBarrier.getNumberWaiting());

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值