多线程并发工具类02-CountDownLatch 线程工具类

源码解析

内部锁结构 (共享锁)

/**
 * 继承AQS,实现共享锁的获取和释放方法
 */
 private static final class Sync extends AbstractQueuedSynchronizer {

        Sync(int count) {
            setState(count);
        }

        int getCount() {
            return getState();
        }    
      /**
       * 状态码为0,则返回1表示获取到锁,否则返回-1,将任务放入同步队列中
       */     
        protected int tryAcquireShared(int acquires) {
            return (getState() == 0) ? 1 : -1;
        }
       /**
        * 释放锁,如果状态码为0,表示没有锁释放,返回false;
        * 否则,state-1,并返回锁是否释放完毕。
        */            
        protected boolean tryReleaseShared(int releases) {
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }
}

初始化

  • 设定初始状态码
  public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }

countDown 方法

  • 释放锁,具体调用的方法上面Syn内部静态子类已经分析了的。state -1
public void countDown() {
        sync.releaseShared(1);
    }

await 方法

  • 实指就是获取锁的状态,必须等初始设置的state == 0 ,才能从同步队列中释放执行。
    public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }
posted @ 2020-09-22 08:02  PerfectLi  阅读(110)  评论(0)    收藏  举报