AQS
AQS全称AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具框架。ReetrantLock
,Semaphore
等都是基于AQS的。可以使用AQS自定义锁。
特点:
- 用state属性来表示资源的状态(独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁
- 提供基于FIFO的等待队列
- 条件变量来实现等待、唤醒机制,支持多个条件变量
AQS原理
AQS核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制。这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
AQS对资源的共享方式
AQS定义两种资源共享方式:
- exclusive。只有一个线程能执行。如ReentrantLock
- share。多个线程可同时执行。