美文网首页
Java并发编程(五) CountDownLatch

Java并发编程(五) CountDownLatch

作者: skyguard | 来源:发表于2018-11-15 18:43 被阅读0次

    下面我们来说一下java并发编程的工具类CountDownLatch。CountDownLatch也叫闭锁,在JDK1.5被引入,允许一个或多个线程等待其他线程完成操作后再执行。CountDownLactch内部维护了一个计数器,这个计数器的数量和线程数量一致,主线程执行await方法阻塞,每完成一个任务,计数器减1,直到计数器为0时,等待的主线程被唤醒继续执行。CountDownLatch有一个内部类Sync,这个类继承了AbstractQueuedSynchronizer,我们来看一下这个类

    Sync(int count) {
            setState(count);
        }
    
        int getCount() {
            return getState();
        }
    

    看一下await方法

    public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }
    

    调用AbstractQueuedSynchronizer的acquireSharedInterruptibly方法

     public final void acquireSharedInterruptibly(int arg)
            throws InterruptedException {
        if (Thread.interrupted())
            throw new InterruptedException();
        if (tryAcquireShared(arg) < 0)
            doAcquireSharedInterruptibly(arg);
    }
    

    获取state的值,不等于0则阻塞线程并加入阻塞队列中,等于0则唤醒主线程继续执行。
    再看一下countDown方法

    public void countDown() {
        sync.releaseShared(1);
    }
    

    调用AbstractQueuedSynchronizer的releaseShared方法

    public final boolean releaseShared(int arg) {
        if (tryReleaseShared(arg)) {
            doReleaseShared();
            return true;
        }
        return false;
    }
    

    通过cas修改state的值,将state的值减1,成功则判断值是否为0,如果为0,则通过LockSupport的unpark方法唤醒当前线程继续执行。
    CountDownLatch就介绍到这里了。

    相关文章

      网友评论

          本文标题:Java并发编程(五) CountDownLatch

          本文链接:https://www.haomeiwen.com/subject/vwzyfqtx.html