在Java中,AQS(AbstractQueuedSynchronizer)是实现同步器的基础框架,它提供了一种实现锁和同步工具的方式。AQS通过使用一个FIFO队列来管理多线程的竞争,它是许多同步器(如ReentrantLock、Semaphore、CountDownLatch等)的基础。
AQS通过内部类Node实现了一个CLH锁队列,用于存储等待获取资源的线程。Node是一个双向链表节点,包含了线程、节点状态以及前后指针。
以下是一个简单的自定义同步器示例,它使用AQS来管理共享资源:
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.AbstractQueuedSynchronizer;public class CustomSync extends AbstractQueuedSynchronizer {// 使用AtomicInteger作为共享资源private AtomicInteger state;protected CustomSync(int initialState) {state = new AtomicInteger(initialState);}// 尝试获取共享资源@Overrideprotected boolean tryAcquire(int arg) {int current = state.get();return state.compareAndSet(current, current - 1);}// 尝试释放共享资源@Overrideprotected boolean tryRelease(int arg) {int current = state.get();return state.compareAndSet(current, current + 1);}// 查询当前共享资源的状态@Overrideprotected boolean isHeldExclusively() {return state.get() == 0;}
}
在这个示例中,我们定义了一个简单的自定义同步器CustomSync,它使用一个AtomicInteger作为共享资源,并重写了tryAcquire和tryRelease方法来尝试获取和释放资源。isHeldExclusively方法用于查询当前同步器是否被独占。
AQS提供了一种清晰的方式来定义如何获取和释放共享资源,以及如何管理等待线程的队列。通过这种方式,开发者可以创建出具有高度可伸缩性和灵活性的同步工具。