AQS的release(int)方法底层源码

news/2025/2/28 11:41:15/文章来源:https://www.cnblogs.com/jock766/p/18742900

一、定义

release(int) 是 AQS(AbstractQueuedSynchronizer)中的一个核心方法,用于在独占模式下释放同步状态。如果释放成功,则会唤醒等待队列中的后继节点,使其有机会获取同步状态


1、release(int) 方法的作用

  • 功能:释放同步状态(独占模式),并唤醒等待队列中的后继节点

  • 返回值:如果成功释放同步状态,则返回 true;否则返回 false


二、release(int) 方法的源码

以下是 release(int) 方法的源码及其详细解析:

public final boolean release(int arg) {if (tryRelease(arg)) { // 尝试释放同步状态// 队列头节点Node h = head;// 头节点什么时候是空?没有发生锁竞争,没有竞争线程创建哨兵节点// 条件成立说明阻塞队列有等待线程,需要唤醒 head 节点后面的线程if (h != null && h.waitStatus != 0) {unparkSuccessor(h); // 唤醒后继节点}return true;}return false;
}


1、tryRelease(int arg) 方法

  • 作用:尝试释放同步状态,由子类实现。

  • 返回值:如果成功释放同步状态,则返回 true;否则返回 false。

  • 示例:

  • 子类需要重写此方法以实现具体的同步逻辑


2、unparkSuccessor(Node node) 方法

  • 作用:唤醒当前节点的后继节点。

  • 参数:

    • node:当前节点(通常是头节点)

         // 找到队列中距离 head 最近的一个没取消的 Node,unpark唤醒线程恢复其运行private void unparkSuccessor(Node node) {// 当前节点的状态int ws = node.waitStatus;if (ws < 0) {// 【尝试重置状态为 0】,因为当前节点要完成对后续节点的唤醒任务了,不需要 -1 了compareAndSetWaitStatus(node, ws, 0); }// 找到需要 unpark 的节点,当前节点的下一个Node s = node.next;if (s == null || s.waitStatus > 0) {  // 如果后继节点为空或已取消不能唤醒,则从队尾开始查找,需要找到距离头节点最近的非取消的节点s = null;for (Node t = tail; t != null && t != node; t = t.prev) {// 说明当前线程状态需要被唤醒if (t.waitStatus <= 0) {// 置换引用s = t;}}}// 【找到合适的可以被唤醒的 node,则唤醒线程】if (s != null) {LockSupport.unpark(s.thread); }}
      


3、compareAndSetWaitStatus(Node node, int expect, int update) 方法

  • 作用:通过 CAS 操作更新节点的 waitStatus。

  • 源码:


4、LockSupport.unpark(Thread thread) 方法

  • 作用:唤醒指定的线程。

  • 源码:


5、release(int) 方法的执行流程


1、调用 tryRelease(int) 尝试释放同步状态。


2、如果成功,则检查头节点是否存在且 waitStatus 不为 0。


3、如果满足条件,则调用 unparkSuccessor(Node) 唤醒后继节点。


4、返回 true 表示释放成功;否则返回 false。


三、总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891090.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Telescope:开源系统log可视化界面管理工具

Telescope 是一款网页应用,旨在提供直观的界面以便于浏览日志数据。它能够兼容任何类型的日志,只要这些日志存储在 ClickHouse 中。用户可以轻松配置与 ClickHouse 数据库的连接,并运行查询以高效地过滤、搜索和分析日志。虽然ClickHouse目前作为主要支持的存储后端,但未来…

P3807 【模板】卢卡斯定理/Lucas 定理

纯手写(迫真)//我在写什么?{#include <bits/stdc++.h> using namespace std; typedef long long ll; #define NO cout << "NO" << endl; #define YES cout << "YES" << endl; ll gcd(ll p, ll q) {return (p % q == 0)?…

Centos8与华为USG建立GRE隧道

拓扑需求:centos8与防火墙建立gre隧道 linux端配置: [root@localhost ~]# cat set_gre.sh #!bin/bashinterface_name="gre1" local_ip="10.0.2.2" remote_ip="201.1.1.2" ipaddress="10.10.10.1" peer_address="10.10.10.2/32…

No.25 CSS--字体图标

一、字体图标我们会经常用到一些图标,但是我们在使用这些图标时,往往会遇到失真的情况,而且图片数量很多的话,页面加载就越慢。所以,我们可以使用字体图标的方式来显示图标,既解决了失真的问题,也解决了图片占用资源的问题。1.常用的字体图标库阿里字体图标库:https://…

浅谈Tox之二

本文分享自天翼云开发者社区《浅谈Tox之二》,作者:Moonriver1. 配置 加载tox.ini并将其与命令行和操作系统环境变量中的选项合并。 2. 包装(可选) 通过调用python setup.py sdist创建当前项目的源代码版本库。 注意对于此操作,Python环境将与安装tox时的相同(因此需要确保…

重塑团队协作:从混乱到高效的团队管理工具指南

设计团队管理工具是一个复杂但至关重要的任务,它要求工具能够满足团队在项目管理、协作、沟通、资源分配和进度跟踪等方面的需求。以下是一些设计团队管理工具时应考虑的关键因素以及推荐的团队管理工具: 设计团队管理工具的关键因素 ● 明确目标与角色分工:工具应支持将团队…

TCP IP 网络协议基础

TCP IP 简介可见 TCP/IP 被分为 4 层,每层承担的任务不一样,各层的协议的工作方式也不一样,每层封装上层数据的方式也不一样:应用层:应用程序通过这一层访问网络,常见 FTP、HTTP、DNS 和 TELNET 协议; 传输层:TCP 协议和 UDP 协议; 网络层:IP 协议,ARP、RARP 协议,…

机械图纸文章标题搜索增强实现过程

机械图纸文章标题搜索增强实现过程 1. 为什么需要使用搜索增强技术机械图纸标题搜索的挑战:机械图纸标题通常包含专业术语、缩写和特定格式(如“土豆分拣机 DWG-001 不锈钢”)。 用户查询可能模糊或表述不同(如“马铃薯筛选机”),传统搜索难以匹配语义相似的标题。 标题信…

煎熬中的二代基因测序

提到基因测序,绝大多数人第一印象就是二代测序。的确,一代Sanger测序弊端太多,三代单分子测序和四代纳米孔测序(生物纳米孔和固态纳米孔)刚刚崭露头角,且有一些问题仍待解决(比如微电流信号精准捕捉、1-3nm原子级纳米孔开孔等)。综合来看,一代Sanger如英雄迟暮、三四代…

智能驾驶辅助系统ADAS

经纬恒润将更高性能的800W像素摄像头、先进的视觉EQ6方案、成熟的控制算法进行了优势组合,推出了全新一代的前视单目摄像头解决方案。经纬恒润智能驾驶辅助系统ADAS新方案旨在更好的应对市场ADAS性能提升与成本压力的博弈,寻找L2+自动驾驶功能升级的最优解。 随着L2+自…

基于 Trae Claude-3.7 从0到1 打造加密货币钱包Dompet-App

从0到1:用Trae Claude-3.7打造加密货币钱包Dompet-App📱 项目介绍 大家好!今天我要分享如何使用强大的AI助手Trae Claude-3.7,从零开始构建一款功能丰富的加密货币钱包应用——Dompet-App。无论你是区块链爱好者还是移动开发新手,这个项目都能让你快速掌握React Native开…