CAS(Compare and Swap,比较并交换)是一种并发编程中常用的原子操作。它是一种乐观锁的实现方式,用于实现非阻塞算法。CAS原理是通过比较内存中的值与预期值,如果相等则将新值写入内存,否则不做任何操作。
AQS(AbstractQueuedSynchronizer)是Java并发包中的一个用于构建同步器的框架。AQS的工作原理是通过一个FIFO队列(即等待队列)来管理线程的排队和阻塞。AQS包含两种模式:独占模式和共享模式。
在独占模式下,AQS可以实现独占锁(如ReentrantLock)和一些阻塞队列(如Semaphore)等同步器。在共享模式下,AQS可以实现共享锁(如CountDownLatch)和一些线程池(如ThreadPoolExecutor)等同步器。
AQS的核心数据结构是一个双向链表,每个节点代表一个线程。当一个线程需要获取同步器的锁时,它会以节点的形式插入到等待队列的末尾。当锁被释放时,AQS会从等待队列中选择一个节点(通常是队头节点)唤醒并允许其获取锁。
如:
通过AQS,Java并发包可以提供各种同步器和线程安全的工具,例如ReentrantLock、CountDownLatch、Semaphore等。这些同步器都是基于AQS的工作原理来实现的,并且可以方便地扩展和定制。