java基础-并发编程-ReentrantLock源码学习

这篇具有很好参考价值的文章主要介绍了java基础-并发编程-ReentrantLock源码学习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ReentrantLock源码

大纲

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

AQS结构

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

非公平锁nonfairTryAcquires实现

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

公平锁TryAcquires实现

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

获取锁失败,将线程添加到链表:addWaiter

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

队列为空或CAS修改链表尾节点失败,将当前节点设置为尾节点

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

尝试再次获取锁,未获取到锁则挂起当前节点线程

final boolean acquireQueued(final Node node, int arg) {
        boolean failed = true;
        try {
            boolean interrupted = false;
            for (;;) {//死循环
                final Node p = node.predecessor();//获得该node的前置节点
                /**
                * 如果前置节点是head,表示之前的节点就是正在运行的线程,表示是第一个排队的
(一般讲队列中第一个是正在处理的,可以想象买票的过程,第一个人是正在买票(处理中),第二个才是真正排队的人);
那么再去tryAcquire尝试获取锁,如果获取成功,说明此时前置线程已经运行结束,则将head设置为当前节点返回
                *
                *
                **/
                if (p == head && tryAcquire(arg)) {
                    setHead(node);
                    p.next = null; // help GC,将前置节点移出队列,这样就没有指针指向它,可以被gc回收
                    failed = false;
                    return interrupted;//返回false表示不能被打断,意思是没有被挂起,也就是获得到了锁
                }
                /**shouldParkAfterFailedAcquire将前置node设置为需要被挂起,
                    注意这里的waitStatus是针对当前节点来说的,
                    即是前置node的ws指的是下一个节点的状态**/
                if (shouldParkAfterFailedAcquire(p, node) &&
                    parkAndCheckInterrupt())//挂起线程 park()
                    interrupted = true;
            }
        } finally {
            if (failed)
                cancelAcquire(node);//如果失败取消尝试获取锁(从上面的代码看只有进入p == head && tryAcquire(arg)这个逻辑是才会触发,这个时候前置节点正好在当前节点入队的时候执行完,当前节点正好获得锁,具体的代码以后分析)
        }
    }
//看到因为是死循环,所以当执行到parkAndCheckInterrupt()时,当前线程被挂起,等到某一天被unpark继续执行,这个时候已经是对头的第二个节点了,那么就会进入if (p == head && tryAcquire(arg))逻辑获取到锁并结束循环

获取锁失败后判断当前线程是否可以被挂起

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

释放锁

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

根据state值是否为0判断重入锁是否释放为0

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言

唤醒被挂起的线程

java基础-并发编程-ReentrantLock源码学习,java基础,java,学习,开发语言文章来源地址https://www.toymoban.com/news/detail-733419.html

到了这里,关于java基础-并发编程-ReentrantLock源码学习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java面试_并发编程_线程基础

    进程是正在运行程序的实例, 进程中包含了线程, 每个线程执行不同的任务 不同的进程使用不同的内存空间, 在当前进程下的所有线程可以共享内存空间 线程更轻量, 线程上下文切换成本一般上要比进程上下文切换低(上下文切换指的是从一个线程切换到另一个线程) 并发是单个

    2024年02月07日
    浏览(44)
  • java并发编程:多线程基础知识介绍

    最初的计算机只能接受一些特定的指令,用户每输入一个指令,计算机就做出一个操作。当用户在思考或者输入时,计算机就在等待。这样效率非常低下,在很多时候,计算机都处在等待状态。 后来有了 批处理操作系统 ,把一系列需要操作的指令写下来,形成一个清单,一次

    2024年02月07日
    浏览(40)
  • 🔥🔥Java开发者的Python快速进修指南:网络编程及并发编程

    今天我们将对网络编程和多线程技术进行讲解,这两者的原理大家都已经了解了,因此我们主要关注的是它们的写法区别。虽然这些区别并不是非常明显,但我们之所以将网络编程和多线程一起讲解,是因为在学习Java的socket知识时,我们通常会将它们结合使用,以实现服务器

    2024年02月05日
    浏览(50)
  • Java并发编程学习16-线程池的使用(中)

    上篇分析了在使用任务执行框架时需要注意的各种情况,并简单介绍了如何正确调整线程池大小。 本篇将继续介绍对线程池进行配置与调优的一些方法,详细如下: ThreadPoolExecutor 为 Executors 中的 newCachedThreadPool 、 newFixedThreadPool 和 newScheduledThreadExecutor 等工厂方法返回的 Exe

    2024年02月10日
    浏览(31)
  • Java并发编程学习18-线程池的使用(下)

    上篇介绍了 ThreadPoolExecutor 配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。 还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。 我们简单回顾下相关的改进过程: 第一次新增时,页

    2024年02月12日
    浏览(29)
  • Java并发编程学习笔记(一)线程的入门与创建

    认识 程序由指令和数据组成,简单来说,进程可以视为程序的一个实例 大部分程序可以同时运行多个实例进程,例如记事本、画图、浏览器等 少部分程序只能同时运行一个实例进程,例如QQ音乐、网易云音乐等 一个进程可以分为多个线程,线程为最小调度单位,进程则是作

    2024年02月16日
    浏览(40)
  • [Java基础系列第5弹]Java多线程:一篇让你轻松掌握并发编程的指南

    多线程是一种编程技术,它可以让一个程序同时执行多个任务,从而提高程序的性能和效率。但是,使用Java多线程也不是一件容易的事情,它涉及到很多复杂的概念和问题,如线程安全、同步、锁、原子类、并发集合、生产者消费者模式、线程池模式、Future模式、线程协作模

    2024年02月14日
    浏览(35)
  • 并发专栏-队列同步器 AQS 以及 Reentrantlock 应用

    Java 中的大部分同步类都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。 ReentrantLock 、 ReentrantReadWriteLock 、 Semaphore(信号量) 、 CountDownLatch 、 公平锁 、 非公平锁 、 ThreadPoolExecutor 都和 AQS 有直接关系,所以了解 AQS 的抽象实现,并在此基础上结合上述各类的实现细节,很快就

    2024年02月07日
    浏览(34)
  • 【JAVA开发面试】如何处理并发访问如何进行代码的单元测试Java多线程编程消息中间件设计模式技术难题是如何解决的

    【 点我-这里送书 】 本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明

    2024年02月03日
    浏览(39)
  • 并发编程 - AQS 源码

    1. AQS 源码 2. AQS 框架具体实现 - 独占锁实现 ReentrantLock 源码 实现 ReentrantLock 的三大核心原理: LocksSuport :加锁解锁 自旋 :如果没有加锁成功就一直自旋 CAS :保证只能有一个线程可以加锁成功 queue 队列:用容器保存上面未加锁成功的阻塞线程,要解锁的时候从容器中拿出

    2023年04月21日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包