Java并发编程-CountDownLatch

  基于

/* 模拟工作中的一个需求场景: 用户会选择多个算法来计算费用,最后会将所有算法计算出的费用做一个加权求平均数,这个平均数是最终的费用。 每个算法的复杂度都不一样,打算每个线程负责一个算法的实现,所有的线程执行完成,最后再求平均数。 1、为每个算法创建一个线程,每个线程负责一个算法的实现 2、通过CountDownLatch来控制所有算法线程的同步 3、全部计算完成后再求平均数  */public class CountDownLatchTask {      public static void main(String[] args) {         CountDownLatchTask countDownLatchTask = new CountDownLatchTask();         countDownLatchTask.startThreads(5);     }     //根据线程数和选择的算法 调度算法对应的实现    private void startThreads(int threadNumber) {         CountDownLatch countDownLatch = new CountDownLatch(threadNumber);         for (int i = 0; i < threadNumber; i++) {             new Thread(new Runnable() {                 @Override                 public void run() {                     System.out.println("线程算法实现:" + Thread.currentThread().getName());                     countDownLatch.countDown();                 }             }).start();         }         try {             countDownLatch.await();             System.out.println("加权求平均数");         } catch (InterruptedException e) {             e.printStackTrace();         }     } }
复制代码

  在分析原理实现前,总结下CountDownLatch的作用就是阻塞其他线程直到条件允许后才释放该阻塞,除了上述这个小案例,实际工作中还有很多可以使用CountDownLatch的场景,比如解析Excel文件时可以同时解析多个Sheet页,所有的Sheet解析完成才算完成了Excel文件的解析。从这个代码中也可以看到CountDownLatch的主要方法就是await和countDown,下面将以这两个方法来分析下CountDownLatch的原理实现。

 2、 源码原理解析

 2.1 await方法

  调用await方法会阻塞当前线程直到计数器的数值为0,方法如下:

复制代码
public void await() throws InterruptedException {         sync.acquireSharedInterruptibly(1); //共享式获取AQS的同步状态}
复制代码

  调用的是AQS的acquireSharedInterruptibly方法:

复制代码
public final void acquireSharedInterruptibly(int arg)             throws InterruptedException {         if (Thread.interrupted())//线程中断 说明闭锁对线程中断敏感            throw new InterruptedException();         if (tryAcquireShared(arg) < 0) //闭锁未使用完成 线程进入同步队列自旋等待             doAcquireSharedInterruptibly(arg);     }
复制代码

  其中tryAcquireShared依赖的是Sync的实现,和之前的ReentrantLockReentrantReadWriteLockSemaphore相比,CountDownLatch的Sync只提供了一种方式,代码如下:

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信