zoukankan      html  css  js  c++  java
  • 并发编程-countdownlatch

    countdownlatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行。从命名可以解读到countdown是倒数的意思,类似于我们倒计时的概念。

    countdownlatch提供了两个方法,一个是countDown,一个是await,countdownlatch初始化的时候需要传入一个整数,在这个整数倒数到0之前,调用了await方法的程序都必须要等待,然后通过countDown来倒数。

    public static void main(String[] args) throws InterruptedException {
            CountDownLatch countDownLatch =new CountDownLatch(3);
            new Thread(()->{
                System.out.println("Thread1");
                countDownLatch.countDown(); //3-1=2
            }).start();
            new Thread(()->{
                System.out.println("Thread2");
                countDownLatch.countDown();//2-1=1
            }).start();
            new Thread(()->{
                System.out.println("Thread3");
                countDownLatch.countDown();//1-1=0
            }).start();
            countDownLatch.await();
            System.out.println("所有线程执行完毕"); 
        }
    }
    public class CountDownLatch {
        /**
         * Synchronization control For CountDownLatch.
         * Uses AQS state to represent count.
         */
        private static final class Sync extends AbstractQueuedSynchronizer {

    对于CountDownLatch,我们仅仅需要关心两个方法,一个是countDown() 方法,另一个是await() 方法。

    countDown() 方法每次调用都会将state 减1,直到state 的值为0;而await 是一个阻塞方法,当state 减为0 的时候,await 方法才会返回。await 可以被多个线程调用,大家在这个时候脑子里要有个图:所有调用了await 方法的线程阻塞在AQS 的阻塞队列中,等待条件满足(state == 0),将线程从队列中一个个唤醒过来。

    acquireSharedInterruptibly

    countdownlatch也用到了AQS,在CountDownLatch内部写了一个Sync并且继承了AQS这个抽象类重写了AQS中的共享锁方法。首先看到下面这个代码,这块代码主要是判断当前线程是否获取到了共享锁;(在CountDownLatch中,使用的是共享锁机制,因为CountDownLatch并不需要实现互斥的特性)

    public final void acquireSharedInterruptibly(int arg) throws InterruptedException {
       if (Thread.interrupted()) throw new InterruptedException();
      
      if (tryAcquireShared(arg) < 0) //state如果不等于0,说明当前线程需要加入到共享锁队列中
        doAcquireSharedInterruptibly(arg); }

    CountDownLatch.countDown

    由于线程被await方法阻塞了,所以只有等到countdown方法使得state=0的时候才会被唤醒,我们来看看countdown做了什么 

    1. 只有当 state 减为 0 的时候,tryReleaseShared 才返回 true, 否则只是简单的 state = state - 1 

    2. 如果state=0, 则调用doReleaseShared 唤醒处于await状态下的线程 

  • 相关阅读:
    1.4.2.3. SETUP(Core Data 应用程序实践指南)
    1.4.2.2. PATHS(Core Data 应用程序实践指南)
    1.4.2.1. FILES(Core Data 应用程序实践指南)
    1.4.2. 实现 Core Data Helper 类(Core Data 应用程序实践指南)
    1.4.1. Core Data Helper 简介(Core Data 应用程序实践指南)
    1.4. 为现有的应用程序添加 Core Data 支持(Core Data 应用程序实践指南)
    1.3.2. App Icon 和 Launch Image(Core Data 应用程序实践指南)
    1.3.1. 新建Xcode项目并设置故事板(Core Data 应用程序实践指南)
    php验证邮箱是否合法
    如何使js函数异步执行
  • 原文地址:https://www.cnblogs.com/yintingting/p/6587193.html
Copyright © 2011-2022 走看看