AQS是AbstractQueuedSynchronizer的缩写,它是Java中一种用于实现同步器的框架。它提供了一种基于FIFO等待队列的同步机制,用于实现锁和其他同步工具。
AQS的工作机制是通过一个共享变量state来表示同步状态,线程要访问共享资源时,首先尝试获取同步状态。如果获取成功,则说明线程可以访问共享资源;否则,线程将被阻塞,并加入到等待队列中。当其他线程释放同步状态时,AQS会唤醒头结点(等待时间最长的线程)来获取同步状态并继续执行。
AQS通过内置的原子操作,如CAS(Compare and Swap),来保证同步状态的原子性。CAS操作可以确保对共享变量的读写操作具有原子性,即同时只有一个线程可以成功修改同步状态。
AQS既可以实现公平锁,也可以实现非公平锁。公平锁是指线程按照申请的顺序依次获取同步状态,而非公平锁则没有这种限制。AQS通过维护一个FIFO的等待队列来实现公平性。当线程请求获取同步状态时,如果队列为空或者当前线程是队列中的第一个线程,则获取同步状态成功;否则,将线程加入到等待队列中,并等待唤醒。