AQS简介
- AQS(AbstractQueuedSynchronizer)是Java并发编程的基础类。
- 用于组织不满足临界条件的线程,如抢锁失败,使用双链表管理。
- 核心变量是
state,通过原子操作compareAndSetState更新。
AQS核心方法
getState():获取当前状态。setState(int newState):设置新状态。compareAndSetState(int expect, int update):安全地更新状态。tryAcquire(int arg):独占方式尝试获取资源。tryRelease(int arg):独占方式尝试释放资源。tryAcquireShared(int arg):共享方式尝试获取资源。tryReleaseShared(int arg):共享方式尝试释放资源。
基于AQS的同步器
- ReentrantLock:支持公平和非公平模式的可重入锁。
- CountDownLatch:允许一个或多个线程等待其他线程完成操作。
- Semaphore:控制同时访问某个特定资源的线程数量。
ReentrantLock详解
- 通过内部类
Sync扩展AQS,实现锁功能。 - 非公平锁:直接尝试获取锁,如果
state为0,则设置为1。 - 公平锁:考虑等待队列中的其他节点,确保公平性。
lock():尝试获取锁,失败则进入AQS队列等待。tryLock():尝试立即获取锁,不进入等待队列。unlock():释放锁,唤醒等待队列中的下一个线程。
CountDownLatch详解
- 用于等待一组事件发生后继续执行。
- 通过内部类
Sync扩展AQS,state表示剩余事件数。 countDown():减少事件数,如果为0则唤醒所有等待线程。await():等待直到事件数为0。
Semaphore详解
- 控制同时访问资源的线程数。
- 通过内部类
Sync扩展AQS,state表示可用许可证数量。 - 非公平模式:直接尝试获取许可证。
- 公平模式:考虑等待队列中的顺序。
acquire():获取一个许可证,如果不足则等待。release():释放一个许可证,唤醒等待的线程。
总结
- AQS通过
state变量和模板方法模式,允许自定义同步器。 - 子类通过重写
tryAcquire、tryRelease、tryAcquireShared和tryReleaseShared方法来定义同步逻辑。 - 示例:自定义一个不可重入的独占锁,当
state为0时,尝试设置为1表示获取锁。
自定义同步器示例
- 定义一个内部类
Sync继承自AQS。 tryAcquire:当state为0时,尝试获取锁。tryRelease:释放锁,确保状态正确。
170万+

被折叠的 条评论
为什么被折叠?



