2018年7月8日 下午3:53
慕课网实战·高并发探索(十一):并发容器J.U.C — AQS组件CountDownLatch、Semaphore、CyclicBarrier - CSDN博客
慕课网实战·高并发探索(十二):并发容器J.U.C — AQS组件 锁:ReentrantLock、ReentrantReadWriteLock、StempedLock - CSDN博客
AQS?
- AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向链表。
- Sync queue:同步队列,是一个双向链表。包括head节点和tail节点。head节点主要用作后续的调度。
- Condition queue:非必须,单向列表。当程序中存在cindition的时候才会存在此列表。
AQS的大致实现思路?
- AQS内部维护了一个CLH队列来管理锁。线程会首先尝试获取锁,如果失败就将当前线程及等待状态等信息包装成一个node节点加入到同步队列sync queue里。
- 接着会不断的循环尝试获取锁,条件是当前节点为head的直接后继才会尝试。如果失败就会阻塞自己直到自己被唤醒。而当持有锁的线程释放锁的时候,会唤醒队列中的后继线程。
CountDownLatch, CyclicBarrier都可以用一个情节理解
- 当我们遇到计算量超大的数据时,我们可以让多个线程分别执行其中一部分的值,当各个线程都执行完之后,我们把各个线程的最后结果进行相加,从而得到最后的效果
- CountDownLatch,CyclicBarrier两种的代码写法可能不同,但是作用是类似的。
CountDownLatch, CyclicBarrier的不同?
- 计数器可重复用
- 描述一个或多个线程等待其他线程的关系/多个线程相互等待
ReentrantLock和Condition就用这个情节理解

票据锁:StempedLock看这个就行。