1.通过CountDownLatch(int count)构造器给sync同步器的state赋值。
2.每调countDown一次state数值-1,直到state为0时唤醒等待队列中head后的第一个线程。
3.没调await方法一次都会去判断state是不是为0,当为0时直接执行,不为0时排队等待,直到被park唤醒。
问题一:为什么使用共享锁而不用独占锁?
独占锁只有在释放资源时才会唤醒head节点的下一个node,如果使用独占锁调用await方法的线程只会执行一个,而共享锁在自身被唤醒得到资源之后会自动去唤醒head的下一个node,通过不断自动唤醒下一个node来达到唤醒所有调用await方法的线程。