AQS: 什么是AQS?
AQS定义了一套多线程访问共享资源的同步器框架. 许多同步类实现都依赖于它,如常用的ReentrantLock/ReentrantReadWriterLock/CountDownLatch
这些类里面都维护了一套aqs的子类,利用子类实现的功能。该队列里面维护的是一堆线程节点。
核心思想是当前线程获取锁的时候如果失败了,就被加入到阻塞队列中(fifo双向队列)配合锁一起使用的。
主要关注getstate().setstate(),compareandsetstate(int expect,int update)
当状态值为0的时候说明没有线程获取锁,否则有线程获取锁,在此当中在判断是不是当前线程,(可重入锁的特性)
可重入锁可以设置公平锁和非公平锁,
非公平锁需要进行2次的cas然后在进入队列,公平锁是看一下对列里面是否有排队的线程,有的话直接添加到队列的尾部排队。
CountDownLatch 调用 await() 方法时,先去获取 state 的值,当计数器不为0的时候,说明还有需要等待的线程在运行,则调用 doAcquireSharedInterruptibly 方法,进来执行的第一个动作就是尝试加入等待队列 ,即调用 addWaiter()方法,await() 方法是线程阻塞,直到计数器为0,才会启动;
如何设置和怎么实现的参见:https://zhuanlan.zhihu.com/p/45305463;
参照:https://www.cnblogs.com/waterystone/p/4920797.html;http://ifeve.com/java-special-troops-aqs/
总结:aqs理解原理就行了,因为了它与锁的结合已经帮我们默认实现了内部机制,无需关心它。