countdownlatch实现了aqs,由此可以知道,同步器锁是由aqs来具体实现的,附出源码
接下来我们从构造方法开始,同步器锁可以在创建时传入参数,这个参数为count数量,具体的含义上篇文章已经讲解,可以查看本人上篇文章,而在构造器内,它把这个参数又传给了Sync
跟进Sync,它是同步器锁的内部类,是他具体实现了AQS ,然后它又把传过来的count传给了AQS中的state,而AQS中的setState方法是设置变量的重入值,意思就是当一个线程占有这把锁时,state就会+1,当再次重入state++,而其他线程想要获取到锁,就要判断state是否为0
,由此可以看出,同步器锁就是把传过来的值传给了AQS当调用同步器锁的countdown方法时,会使得state--,直到为0.
下面查看await方法
在源码中看到,它调用了sync中的 acquireSharedInterruptibly方法,而sync是上面提到的Sync的类型
而AQS中acquireSharedInterruptibly是可以被打断的,当判断当前线程的打断的是否处于sleep或者wait状态,如果是那么就立即抛出异常,然后获取state的值
继续跟进,可以看到如果state的值==0那么就返回1否则就返回-1,回到刚才的判断条件如果返回的<0那么就会进入到doAcquireSharedInterruptibly(arg)
跟进,此方法为AQS中的方法,其实就是死循环,然后获取再次尝试获取state状态,如果还是<=0那么就把它加入到双向链表当中,等待其他线程唤醒,由此countdownlantch原理基本完毕
总结,其实同步器锁就是调用了AQS中的方法,当await条件不满足时就会把当前线程加入到双向链表当中park住,而唤醒的方法就是调用countdown方法,但是第一个调用countdown后唤醒了await线程,然后获取state发现还是>0,那么就继续加入链表然后park,知道state<=0时才会return出去;