ReentrantLock
lock() --->会把state 从0变成1 CAS操作, 1表示这个排他锁被占用了
unlock() 会把state减去1,直到减到0,把AQS的独占线程置空锁释放成功
CountDownLatch实现原理
1.CountDownLatch在构造时传递的参数int值用来初始化 AQS的state值(其实是AQS的实现类Sync)
2.一旦有一个线程调用await()就要去获取锁tryAcquireSharedNanos(), state不为0就获取不到. 所以入队等着
3.只要有一个线程调用了countDown()就会使state-1(用CAS操作确定其原子性),一旦减到0就会传播式地唤醒等待中的线程.
传播的过程中:队列后面的那个节点如果是需要唤醒的就唤醒它,如果不需要唤醒,就把队头设置成propagate状态来保证后面需要唤醒的节点成员排到队头的下一个时可以被正常唤醒(传播会继续).