闭锁CountDownLatch的源码实现介绍

    首先,我们先来了解下闭锁的知识。闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用就相当于一扇门,在闭锁到达结束状态之前,这门一直是关闭的,并且没有任何线程可以通过,当到达结束状态时,这门打开并允许所有的线程通过,当闭锁到达结束状态之后,将不会改变闭锁的状态,一直保持着打开的状态,闭锁可以确保某些活动指导其他活动都完成后才继续执行。下面看一个具体的实现。

package com.nine.concurrent;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {
   public long timeTasks(int nThreads,final Runnable task) {
       
     final CountDownLatch startGate = new CountDownLatch(1) ;
     final CountDownLatch enddGate = new CountDownLatch(nThreads);
     for(int i = 0;i<nThreads;i++){
         Thread t = new Thread(){
             
             @Override
            public void run() {
                 try {
                    startGate.await();
                    
                    
                      try{
                          task.run(); 
                     }finally{
                         enddGate.countDown();     
                     }
                      
                } catch (InterruptedException e) {
                    
                    e.printStackTrace();
                }
            }
         };
         
        t.start(); 
     }   
       
     long start = System.nanoTime();
     startGate.countDown();
     try {
        enddGate.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
     long end = System.nanoTime();
       
    return end-start;
}    
}

这个demo中,使用了闭锁,而不是在线程创建后就立即启动,启动门,startGate使得主线程能够同时释放所有的工作线程,而结束门,可以使主线程能够能带最后一个线程执行完成,而不是顺序的等待每个线程执行完成。

下面来介绍下闭锁的具体实现:

所含方法: await(),await(long, TimeUnit),countDown,getCount
内部静态类Sync extends AbstractQueuedSynchronizer
1、两个公开方法,await和countDown,不存在获取资源的操作,在初始化的时候已经设置state。tryAcquireShared只是做检查操作,如果等于0,就返回1
countDown做releaseShared操作,它的实现是基于AQS的实现机制。下次重点解读下AQS的原理

 

posted @ 2014-03-05 21:43  zl204  阅读(162)  评论(0编辑  收藏  举报