CountDowdLatch解析

CountDownLatch 是使用 AQS 现的,实际上是把计数器的值赋给了 AQS 的状态变量 state ,也就是这里使用 AQS 状态值来表示计数器值。

await方法

awai内部是调用acquireSharedInterruptibly方法:
当线程调 CountDownLatch 对象的 await 方法后 当前线程会被 直到下面的
情况之一发生才会返回 当所有线程都调用了 CountDownLatch 对象的 countDown 方法后,也就是计数器 值为0时;其他线程调用了当前线程的 interrupt ()方法中断了当前线程当前线程就会抛出 InterruptedException 异常 然后返回。

 public final void acquireSharedInterruptibly(int arg)
            throws InterruptedException {
        if (Thread.interrupted())
            throw new InterruptedException();
            //当state计数值不为0时,阻塞主线程
        if (tryAcquireShared(arg) < 0)
            doAcquireSharedInterruptibly(arg);
    }
    //判断state计数值,为0时返回1,否则返回-1
protected int tryAcquireShared(int acquires) {
       return (getState() == 0) ? 1 : -1;
   }

countDown ()方法

线程调用该方法后 ,计数器的值递,递减后如果计数器值为0 则唤醒所有因调用await 法而被阻塞的主线程,否则什么都不做

  public final boolean releaseShared(int arg) {
        if (tryReleaseShared(arg)) {
        //计数器返回true,释放锁,唤醒await的线程
            doReleaseShared();
            return true;
        }
        return false;
    }
//计数器值减,当计数器值为0是返回true
  protected boolean tryReleaseShared(int releases) {
        // Decrement count; signal when transition to zero
        for (;;) {
            int c = getState();
            if (c == 0)
                return false;
            int nextc = c - 1;
            if (compareAndSetState(c, nextc))
                return nextc == 0;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值