👩🏽💻个人主页:阿木木AEcru
🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》
💹每一次技术突破,都是对自我能力的挑战和超越。
目录
一、并发编程之AQS
AQS(AbstractQueuedSynchronizer)是 Java 并发编程中的一个重要组件,作为多线程同步器,它在 Java 并发包(java.util.concurrent)多个组件的底层实现。如 Lock、CountDownLatch、Semaphore 等都用到了它。
在 AQS 的设计中,它主要提供了两种锁机制:排它锁和共享锁。
- 排它锁(Exclusive Lock):也称为独占锁,它确保在同一时刻只有一个线程可以访问共享资源。这意味着当多个线程竞争同一资源时,只有一个线程能够获得锁,并且其他线程必须等待。比如,ReentrantLock 中的重入锁就是排它锁的一种实现,它利用 AQS 实现了这种独占的锁机制。
- 共享锁(Shared Lock):也称为读锁,它允许多个线程同时访问共享资源,从而提高了并发性。多个线程可以同时获得锁资源,这在某些场景下是非常有用的。比如,CountDownLatch 和 Semaphore 就是利用 AQS 中的共享锁实现的。
它主要由以下几个组成部分构成:
- 节点(Node): 用于封装等待获取同步状态的线程。每个节点都包含了线程的引用和状态信息,以双向链表的形式组织在一起,构成等待队列。
- 状态(State): 表示共享资源的状态,可以是任意的整数值,代表不同的含义,比如锁的状态或信号量的剩余资源数量。
- 等待队列(Wait Queue): 存放等待获取同步状态的线程节点的双向链表。
- 同步器方法(Sync Methods): 定义了 AQS 的抽象方法,子类通过实现这些方法来控制同步状态的获取和释放行为,比如tryAcquire()、tryRelease()等。
- 条件对象(Condition): 支持精确线程等待和通知机制,用于在满足特定条件之前等待,并在条件满足时被唤醒。
下面的cas它也有用到,继续往下看吧。