AQS队列锁原理解析
AQS锁
AQS是基于队列来实现锁的分配的;它的全称是:AbstractQueuedSynchronizer(抽象队列式同步器)
AQS是一个用来构建锁和其他同步组件的基础框架
核心思想
如果被请求的共享资源空闲(即没有被锁定的状态),则将当前请求资源的线程设置为有效的工作线程
,并且将共享资源设置为锁定
状态。如果被请求的共享资源被占用(即锁定状态),那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制就是AQS;AQS是用CLH队列锁
实现的,即将暂时获取不到锁的线程加入到队列中。
AQS是将每一条请求共享资源的线程封装成一个CLH队列锁
的一个结点,来实现锁的分配。
所以首先我们需要去了解CLH队列锁
AQS是CLH锁的变种升级
下面我们直接看AQS在Java中的应用AbstractQueuedSynchronizer
(抽象队列式同步器)
常见的应用
JDK中几种常见使用了AQS的同步组件:
- ReentrantLock : 使用了AQS的独占获取和释放,用state变量记录某个线程获取独占锁的次数,获取锁时+1,释放锁时-1,在获取时会校验线程是否可以获取锁。
- Semaphore : 使用了AQS的共享获取和释放,用state变量作为计数器,只有在大于0时允许线程进入。获取锁时-1,释放锁时+1。
- CountDownLatch : 使用了AQS的共享获取和释放,用state变量作为计数器,在初始化时指定。只要state还大于0,获取共享锁会因为失败而阻塞,直到计数器的值为0时,共享锁才允许获取,所有等待线程会被逐一唤醒。
AbstractQueuedSynchronizer
常见用法
ReentrantLock重入锁 Semaphore信号灯 CountDownLatch计数器