图解源码之java锁的获取和释放(AQS)篇

以独占式不公平锁为例,通过5个线程争夺ReentrantLock的过程,图解ReentrantLock源码实现,了解显示锁的工作流程。

 

 

《图解源码之java锁的获取和释放(AQS)篇》《图解源码之java锁的获取和释放(AQS)篇》

 

任何时刻拿到锁的只有一个线程,未拿到锁的线程会打包成节点(node),然后将节点通过CAS自旋的方式,从队列尾部放入同步队列中。

 《图解源码之java锁的获取和释放(AQS)篇》

 

《图解源码之java锁的获取和释放(AQS)篇》

 

增加尾节点为什么要用cas,因为会存在多个线程竞争尾节点。

 《图解源码之java锁的获取和释放(AQS)篇》《图解源码之java锁的获取和释放(AQS)篇》

 

 《图解源码之java锁的获取和释放(AQS)篇》

《图解源码之java锁的获取和释放(AQS)篇》

以上便是线程竞争锁的过程,以及竞争失败之后需要做的全部事情。

 

《图解源码之java锁的获取和释放(AQS)篇》

《图解源码之java锁的获取和释放(AQS)篇》

以上便是线程获取和释放锁的全过程,可用如下流程图进行归纳。

 《图解源码之java锁的获取和释放(AQS)篇》

 

另外,以上源码均来自jdk1.8,本文章作为梳理思路,仅摘要了关键部分,详细流程请读者跟着思路自行阅读源码,英文过关是阅读的必要技能之一,不然看不懂注释真的很蛋疼。。重要的事情说三遍,英文一定要好!

英文一定要好!英文一定要好!

 

    原文作者:开心的鱼a1
    原文地址: https://www.cnblogs.com/dw-haung/p/9274992.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞