http://xhslink.com/0yW6BR
AQS(AbstractQueuedSynchronizer)的原理是基于一个 FIFO(先进先出)队列和一个同步状态(state)来实现线程的排队和同步。
AQS 的核心思想是,当线程尝试获取同步状态时,如果同步状态已经被其他线程占用,则将当前线程包装成一个节点(Node)并入队等待,否则直接获取同步状态。同时,AQS 会确保只有队列中第一个节点的线程才能获取同步状态,其他节点需要等待前面的节点释放同步状态。
AQS 的主要实现机制如下:
- 内部队列:AQS 维护一个 FIFO 队列,用于存储等待获取同步状态的线程。每个线程通过 Node 对象来表示,并包含了线程的引用和状态信息。
- 同步状态(state):AQS 内部维护一个同步状态,用于表示同步资源的状态。不同的同步器可以根据自己的需求使用同步状态来表示不同的含义,如锁的可重入次数、Semaphore 的可用许可数等。
- CAS 操作:AQS 使用(Compare ans Swap)操作来实现对同步状态的原子修改。CAS 操作通过比较内存中的值与期望值,如果相等则进行修改,否则不进行修改。
- 线程调度:AQS 通过自旋(自旋锁)和阻塞(等待队列)两种方式进行线程的调度。当线程无法获取同步状态时,会进入阻塞状态,直到被前面的节点唤醒。在自旋期间,线程会不断尝试获取同步状态,避免线程切换的开销。