aqs 的内容太多,所以我们分成了两个章节,没有看过 aqs 上半章节的同学可以回首看一下哈,上半章节里面说了很多锁的基本概念,基本给山区小朋友的一封信属性,如何获得锁等等,本章我们主要聊下如何释放锁和同步队列两大部分。
释放锁的触发时机就是我们常用的 lock.unlock () 方法,目的就是让线程释放对资源的访问权(流程见整体架构图紫色路线)。
释放锁也是分为两类,一类是排它锁的释放,一类是共享锁的释放大洲分界线,我们分别来看下。
排它锁的释放就比较简单了,从队头开始,找它的下一个节点,如果下一个节点是空的,就会从尾开始,一直找到状态不是取消的节点,然后释放该节点,源码如下:
释放共享锁的方法是 releashared,主要分成两步:
tryreleashared 尝试释放当前共享锁,失败返回 fal,成功走 2;
唤醒当前节点的后续阻塞节点,这个方法我们之前看过了,线程在获得共享锁的时候,就会去唤醒其后面的节点,方法名称为:doreleashared。
我们一起来看下 releashared 的源码:
在看条件队列的方法之前,我们先得弄明白为什么有了同步队列,还需要条件队列?
主要是因为并不是所有场景一个同步队列就可以搞定的,在遇到锁 + 队列结合的场景时,就需要 lock + condition 配合才行,先使用 lock 来决定哪些线程可以获得锁,哪些线程需要到同步队列里面排队阻塞;获得锁的多个线程在碰到队列满或者空的时候,可以使用 condition 来管理这些线程,让这些线程阻塞等待,然后在合适的时机后,被正常唤醒。
同步队列 + 条件队列联手使用的场景,最多被使用到锁 + 队列的场景中。
所以说条件队列也是不可或缺的一环。
接下来我们来看一下条件队列一些比较重要的方法,以下方法都在 conditionobject 内部类中。
await 方法有几点需要特别注意:
上述代码great big world标记位置 a 处,节点在准备进入条件队列之前,一定会先释放当前持有的锁,不然自己进去条件队列了,其余的线程都无法获得锁了;上述代码标记位置 b 处,此时节点是被 condition.signal 或者 signalall 方法唤醒的,此时节点已经成功的被转移到同步队列中去了(整体架构图中蓝色流程),所以可以直接执行 acquirequeued 方法;node 在条件队列中的命名,源码喜欢用 waiter 来命名,所以我们在条件队列中看到 waiter,其实就是 node。
await 方法中有两个重要方法:addconditionwaiter 和 unlinkcancelledwaiters,我们一一看下。
addconditionwaiter 方法主要是把节点放到条件队列中,方法源码如下:
整体过程比较简单,就是追加到队列的尾部,其中有个重要方法叫做 unlinkcancelledwaiters,这个方法会删除掉条件队列中状态不是 condition 的所有节点,我们来看下 unlinkcancelledwai民俗作文ters 方法的源码,如下:
为了方便大家理解这个方法,画了一个释义图,如下:
signal 方法是唤醒的意思,比如之前队列满了,有了一些线程因为 take 操作而被阻塞进条件队列中,突然队列中的元素被线程 a 消费了,线程 a 就会调用 signal 方法,唤醒之前阻塞的线程,会从条件队列的头节点开始唤醒(流程见整体架构图中蓝色部分),源码如下:
我们来看下最关键的方法:transferforsignal。
整个源考研机构辅导码下来,我们可以看到,唤醒条件队列中的节点,实际上就是把条件队列中的节点转移到同步队列中,并把其前置节点状态置为 signal。
signalall 的作用是唤醒条件队列中的全部节点,源码如下:
从源码中可以看出,其本质就是 for 循环调用 transferforsignal 方法,将条件队列中的节点循环转移到同步队列中去。
aqs 源码终于说完了,你都懂了么,可以在默默回忆一下 aqs 架构图,看看这张图现在能不能看懂了。
以上就是java同步器aqs架构abstractqueuedsynchronizer原理解析下的详细内容,更多关于java同步器abstractqueuedsynchronizer的资料请关注www.887551.com其它相关文章!
本文发布于:2023-04-06 03:02:15,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/4a56e5fcb5e0b467d6ba5102627164d6.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java同步器AQS架构AbstractQueuedSynchronizer原理解析下.doc
本文 PDF 下载地址:java同步器AQS架构AbstractQueuedSynchronizer原理解析下.pdf
留言与评论(共有 0 条评论) |