导图(用于总结和复习)
AQS框架
定义:aqs(AbstractQueuedSynchronizer)是一个用来构建锁或者其他同步器的基础框架。包括常用的独占锁:ReentrantLock。共享锁:CountDownLatch、CyclicBarrier、Semaphore等。
核心原理:
aqs的实现原理靠三个核心:
1. FIFO队列实现线程等待排队,把没有竞争到锁的线程放入队列。队列的每个节点存储了线程、上节点、下节点、waitStatus。其中线程用来记录排队的线程,上下节点用来做双向链表把前后节点连接起来,waitStatus用来记录等待状态。并且用head和tail分表指向头节点和尾节点,头节点的 thread=null,是一个用来管理下一个节点的空节点。
(FIFO:First Input First Output,先进先出)
2. 使用CAS维护一个 volatile int state 来表示同步状态。FIFO队列里的线程采用自旋+CAS维护state。
3. LockSupport维护线程阻塞和唤醒。使用LockSupport.park()和LockSupport.unpark()方法来维护线程的阻塞和唤醒,放入FIFO队列的线程使用 LockSupport.park() 阻塞起来,等待获取到锁的线程 unpark 唤醒