AQS, AbstractQueuedSynchronizer ,抽象队列同步器,定义了一套多线程访问共享资源的同步器框 架,许多并发工具的实现都依赖于它,如常用的 ReentrantLock/Semaphore/CountDownLatch 。
AQS使用一个 volatile 的int类型的成员变量 state 来表示同步状态,通过CAS修改同步状态的值。当 线程调用 lock 方法时 ,如果 state =0,说明没有任何线程占有共享资源的锁,可以获得锁并将 state 加1。如果 state 不为0,则说明有线程目前正在使用共享变量,其他线程必须加入同步队列进行等待。
privatevolatileintstate;//共享变量,使用volatile修饰保证线程可见性
同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败 时,同步器会将当前线程以及等待状态(独占或共享 )构造成为一个节点(Node)并将其加入同步队 列并进行自旋,当同步状态释放时,会把首节点中的后继节点对应的线程唤醒,使其再次尝试获取同步 状态。