AQS是什么? 它的实现原理是什么? 它是怎么实现的?
Posted 栗子~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AQS是什么? 它的实现原理是什么? 它是怎么实现的?相关的知识,希望对你有一定的参考价值。
文章目录
前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
AQS是什么? 它的实现原理是什么? 它是怎么实现的?
01 AQS是什么?
AQS指的是AbstractQueuedSynchronizer-抽象队列同步器
锁机制的一个规范。
在java.util.concurrent工具包中,这个包简称为JUC。
02 AQS的实现原理?
AQS维护了一个volatile的修饰的共享变量state和一个FIFO线程等待队列,多线程争用资源被阻塞的时候会进入这个队列,state是一个共享变量,其访问有三种方式:getState() setState() compareAndSetState()[通过CAS是机制],通过尝试获取共享变量state的结果来对线程的状态做出处理。
AQS是将每一条请求共享资源的线程封装成一个CLH队列(虚拟的双向队列)的一个结点来实现锁的分配。根据volatile修饰的state共享变量,线程通过CAS去改变状态。
如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现,即将暂时获取不到锁的线程加入到队列中等待唤醒。
CLH虚拟队列:是一个虚拟的双向队列,不是一个具体的队列,只有结点和结点之间的关联关系。
总结:AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去改变状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。
03 AQS典型的实现类和资源共享方式?
ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier、ReentrantReadWriteLock都是AQS的衍生物,他们都是我们【抽象队列同步器】的实现。
独占:只要一个线程能执行,ReentrantLock;
共享:多个线程可以同步执行,CountDownLatch、Semaphore、CyclicBarrier;
独占和共享:ReentrantReadWriteLock;
04 AQS的实现?
同步器的设计是给予模板方法模式,如果要实现同步器一般的方式的过程:
1)、继承AbstractQueuedSynchronizer并重写指定的方法。
2)、将AQS组合在同步组件的实现中,并调用其模板方法,而这些模板方法会调用使用者重写的方法。
04::01 AQS的实现-ReentrantLock
- state初始化为0,表示未锁定状态,A线程lock()时,调用tryAcquire()独占锁方法并将state+1。
- 之后其他线程在想tryAcquire()时候就会失败,直到A线程unlock()到state=0为止,其他线程才有机会获取该锁。
- A释放锁之前,自己也是可以重复获取此锁(state累加),这就是可重复锁的概念。
04::02 AQS的实现-CountDownLatch
- 我们任务分为n个子线程去执行,state就初始化为n,n个线程并行执行。
- 每个线程执行完毕之后countDown()一次,state就会CAS原子性-1。
- 当n个子线程执行完毕之后,state=0,会unpark调用主线程,主线程就会从await方法函数回调,继续之后的操作。
以上是关于AQS是什么? 它的实现原理是什么? 它是怎么实现的?的主要内容,如果未能解决你的问题,请参考以下文章