首页 > 编程语言 >Java并发(六):ReentrantLock的解锁过程

Java并发(六):ReentrantLock的解锁过程

时间:2024-09-22 13:21:56浏览次数:3  
标签:node 状态 结点 waitStatus Java 解锁 ReentrantLock 线程 方法

可以看到其调用的还是内部类sync的方法,而且可以看到这是一个无返回值的方法

并且传入了一个为1的参数

release方法


在这里插入图片描述

可以看到,其调用的是AQS里面的release方法

步骤如下

  • 先调用tryRelease方法,尝试进行解锁

  • 然后判断是否需要唤醒线程

  • 返回true,代表释放锁成功

  • tryRelease方法返回false,表表释放锁失败,返回false

tryRelease方法

在这里插入图片描述

可以看到这个方法是AQS里面的一个未实现的方法,实现这个方法有ReentrantLock与ReentrantReadWriteLock

所以,具体的实现肯定是ReentrantLock的

实现的源码如下所示

在这里插入图片描述

步骤如下

  • 计算锁被释放后的新状态,记录在变量c

  • 判断当前线程是不是拥有锁(如果拥有了锁,在AbstartOwnableSychronizer的exclusiveOwnerThread会记录,AOS是被AQS所继承的)

  • 如果不拥有锁就会报错,因为锁并不是自己的,没有资格释放

  • 定义一个free变量看是否锁的新状态是不是变成可被占用了(进入到这一步就证明了当前线程拥有锁)

  • 判断新的状态是不是为0

  • 如果是0,让free变量为true,并且将锁记录占用自己的线程为null

  • 将锁的状态更新(这一步过后,其他线程就可以争夺锁了,因为ReentrantLock的状态已经变为了0)

  • 返回free变量给上一层,告知上一层锁是否不被占用了

接下来我们返回到release方法

下面的判断是这样的

在这里插入图片描述

从上面可以看到,如果锁没被占用了,那么tryRelease方法就会返回True,那么就会进行下面的判断

  • 先记录一下当前线程队列的头结点

  • 判断头结点是否不为空,而且waitStatus状态是否不为0(0代表线程正常运行,-1代表被挂起)

  • 如果头结点不为空,代表仍有线程在等待

  • 如果头结点waitStatus不为0,那就代表后面的线程被挂起了或者取消了(这个操作是针对后面的那些线程等待时间过长,CAS超过了两次,全部进入了挂起状态)

  • 所以,接下来的一步就是去唤醒被后面被挂起的线程(前面提到过,队列里面是不存放正在执行的线程的,只存放需要排队的线程,头结点是不放线程的,不过会记录上一个执行线程的状态,因为在获取锁的时候,是将要执行的线程为头结点,然后将头结点里面的thread改为了null,但waitStatus是还在的

  • 返回True

  • 如果头结点为空,或者头结点状态为0

  • 代表没有线程等待了

  • 返回false

unparkSuccessor方法

这个方法是唤醒被挂起的头结点,并且还要去整理线程队列

这个方法也是AQS里面的

源码如下

private void unparkSuccessor(Node node) {

/*

  • If status is negative (i.e., possibly needing signal) try

  • to clear in anticipation of signalling. It is OK if this

  • fails or if status is changed by waiting thread.

*/

//判断头结点的waitStatus状态

int ws = node.waitStatus;

//如果waitStatus小于0,

//代表上一个执行的线程起先是休眠的,然后是被唤醒执行的

if (ws < 0)

//让这个线程cas改变自己的waitStatus

compareAndSetWaitStatus(node, ws, 0);

/*

  • Thread to unpark is held in successor, which is normally

  • just the next node. But if cancelled or apparently null,

  • traverse backwards from tail to find the actual

  • non-cancelled successor.

*/

//此时就是唤醒后面的线程了

Node s = node.next;

//如果头结点的下一个结点为空

//或者头结点的下一个结点的waitStatus状态大于0(代表被线程被取消执行)

if (s == null || s.waitStatus > 0) {

s = null;

//从队列后面开始遍历,找到最先被挂起的线程!

标签:node,状态,结点,waitStatus,Java,解锁,ReentrantLock,线程,方法
From: https://blog.51cto.com/u_17015016/12080212

相关文章

  • Java开发八月七号下午笔试 面试
    SpringBoot有两种配置方式,properties和yml,两种配置方式只是格式上不同,功能是一致的,比如properties:server.port=8080对应的yml:server:port:8080就实际开发而言,yml更简洁一些,但是properties出错率更低一些。2、SpringBoot怎么修改启动时的端口号?(1)、在配置文件中修改端口号:......
  • 【java面经速记】Mysql和ES数据同步
    目录Mysql业务数据库ES查询数据库数据同步方案同步双写异步双写(MQ方式)基于Mysql的定时扫描同步基于Binlog实时同步使用canal监听binlog同步数据到es(流行方案)拓展:mysql的主从复制原理canal原理:数据迁移同步工具Mysql业务数据库核心特点:开源免费、高并发、稳定、......
  • 【java面经】微服务架构速记
    目录由来是什么本质和单体架构的区别适用项目开发框架SpringCloud(流行)DubboDropwizardConsul,etcd&etc(微服务的模块)由来独立系统,SOA服务切换时间长,成本高,不够稳定是什么一套小服务来开发单个应用,每个服务运行在自己的进程中,使用HTTPAPI等轻量级机制通信服务可......
  • 测试类 测试 java
    1importcom.alibaba.fastjson.JSON;2importcom.alibaba.fastjson.JSONObject;3importcom.lgq.ai.YouProjectApplication;4importcom.lgq.ai.service.XxxService;5importorg.junit.Test;6importorg.junit.runner.RunWith;7importorg.springframewor......
  • JAVA开源项目 甘肃非物质文化网站 计算机毕业设计
    本文项目编号T042,文末自助获取源码\color{red}{T042,文末自助获取源码}......
  • JAVA开源项目 房屋租赁系统 计算机毕业设计
    本文项目编号T041,文末自助获取源码\color{red}{T041,文末自助获取源码}......
  • JavaScript数据类型转换 字符串
    类型转换数据类型的转换有两种方式,一种是在运算等处理过程中自动转换,另一种是显式的转换。字符串类型转换除了在处理过程中的隐式转换,可以使用String(Value)函数进行转换。例子1:letval1=true;letval2=false;letval3=null;letval4=99;letval5=798.125; console.log(......
  • 解锁Java线程池:实战技巧与陷阱规避
    专业在线打字练习网站-巧手打字通,只输出有价值的知识。一前言线程池作为初学者常感困惑的一个领域,本次“巧手打字通课堂”将深入剖析其中几个最为普遍的误区。为了更清晰地阐述这些知识点,让我们以一个具体定义的线程池为例来展开说明。如下:ThreadPoolExecutorexecutor=ne......
  • JAVA毕业设计|(免费)springboot农产品智慧物流系统包含文档代码讲解
    收藏点赞不迷路 关注作者有好处编号:springboot537springboot农产品智慧物流系统开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis工具:IDEA/Ecilpse、Navicat、Maven1.万字文档展示(部分)2.系统图片展示第5章系统详细设计......
  • JAVA毕业设计|(免费)springbootJAVA流浪动物救助平台-包含文档代码讲解
    收藏点赞不迷路 关注作者有好处编号:springboot530springbootJAVA流浪动物救助平台-开发语言:Java数据库:MySQL技术:Spring+SpringMVC+MyBatis工具:IDEA/Ecilpse、Navicat、Maven1.万字文档展示(部分)2.系统图片展示第5章系统详细设计系统实现部分就是将系统分析,系......