Java可重入锁(GPT编写)
Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。在本篇博客中,我们将对Java可重入锁的源码进行分析,以便更好地理解它的实现原理和使用方法。
Java可重入锁的实现原理
Java可重入锁的实现基于AQS(AbstractQueuedSynchronizer)框架,它是Java并发包中的一个重要组件。AQS框架提供了一种通用的同步机制,可以用于实现各种锁和同步器。Java可重入锁就是基于AQS框架实现的。
Java可重入锁的实现主要包括以下几个部分:
锁状态
Java可重入锁的状态由一个整型变量state表示,它表示锁的持有次数。当state为0时,表示锁没有被任何线程持有;当state大于0时,表示锁被某个线程持有,且持有次数为state。
获取锁
当一个线程尝试获取Java可重入锁时,它会首先尝试获取锁的状态。如果state为0,则表示锁没有被任何线程持有,此时该线程可以直接获取锁,并将state设置为1。如果state大于0,则表示锁已经被某个线程持有,此时需要判断持有锁的线程是否为当前线程。如果是当前线程,则可以直接获取锁,并将state加1;如果不是当前线程,则需要将当前线程加入等待队列,并等待锁的释放。
释放锁
当一个线程释放Java可重入锁时,它会将锁的状态state减1。如果state减为0,则表示锁已经完全释放,此时需要唤醒等待队列中的一个线程,让它获取锁。如果state仍然大于0,则表示锁还被某个线程持有,此时只需要将state减1即可。
可重入性
Java可重入锁支持可重入性,即同一个线程可以多次获取同一个锁,而不会造成死锁或其他并发问题。实现可重入性的关键在于,每个线程需要记录自己已经获取锁的次数,以便在释放锁时正确地减少锁的持有次数。
Java可重入锁的源码分析
下面我们来看一下Java可重入锁的源码实现。Java可重入锁的主要实现类是ReentrantLock,它继承了AQS框架的抽象类AbstractQueuedSynchronizer。
锁状态
Java可重入锁的状态由一个整型变量state表示,它定义在AbstractQueuedSynchronizer类中:
private volatile int state;
获取锁
当一个线程尝试获取Java可重入锁时,它会调用tryAcquire方法。该方法首先会判断锁的状态state是否为0,如果是,则表示锁没有被任何线程持有,此时可以直接获取锁,并将state设置为1。如果state不为0,则需要判断持有锁的线程是否为当前线程。如果是当前线程,则可以直接获取锁,并将state加1;如果不是当前线程,则需要将当前线程加入等待队列,并等待锁的释放。
protected final boolean tryAcquire(int acquires) {Thread current = Thread.currentThread();int c = getState();if (c == 0) {if (compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}} else if (current == getExclusiveOwnerThread()) {int nextc = c + acquires;if (nextc < 0) // overflowthrow new Error("Maximum lock count exceeded");setState(nextc);return true;}return false;
}
释放锁
当一个线程释放Java可重入锁时,它会调用tryRelease方法。该方法会将锁的状态state减1。如果state减为0,则表示锁已经完全释放,此时需要唤醒等待队列中的一个线程,让它获取锁。如果state仍然大于0,则表示锁还被某个线程持有,此时只需要将state减1即可。
protected final boolean tryRelease(int releases) {int c = getState() - releases;if (Thread.currentThread() != getExclusiveOwnerThread())throw new IllegalMonitorStateException();boolean free = false;if (c == 0) {free = true;setExclusiveOwnerThread(null);}setState(c);return free;
}
可重入性
Java可重入锁支持可重入性,即同一个线程可以多次获取同一个锁,而不会造成死锁或其他并发问题。实现可重入性的关键在于,每个线程需要记录自己已经获取锁的次数,以便在释放锁时正确地减少锁的持有次数。Java可重入锁通过ThreadLocal变量来记录每个线程已经获取锁的次数。
private static final class HoldCounter {int count = 0;final long tid = getThreadId(Thread.currentThread());
}private transient ThreadLocal<HoldCounter> holdCounts = new ThreadLocal<HoldCounter>();private int getHoldCount() {HoldCounter rh = holdCounts.get();return (rh == null) ? 0 : rh.count;
}private void setHoldCount(int count) {HoldCounter rh = holdCounts.get();if (rh == null) {rh = new HoldCounter();holdCounts.set(rh);}rh.count = count;
}
总结
Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。Java可重入锁的实现基于AQS框架,它通过状态变量state和等待队列来实现锁的获取和释放。Java可重入锁支持可重入性,即同一个线程可以多次获取同一个锁,而不会造成死锁或其他并发问题。
相关文章:
Java可重入锁(GPT编写)
Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。在本篇博客中,我们将对Java可重入锁的源码进行分析,以便更好地理解它的实现原理和使用方法。 Java可重入锁的…...
京东数据平台:2023年9月京东净水器行业品牌销售排行榜!
鲸参谋监测的京东平台9月份净水器市场销售数据已出炉! 根据鲸参谋平台的数据显示,今年9月份,京东平台净水器的销量为64万,环比下滑约9%,同比下滑约16%;销售额为5.2亿,环比下滑约12%,…...
skiaSharp linux 生成验码字体显示不出来
一、拷贝windows下的字体如:C:\Windows\Fonts 设置字体的地方: var fontPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Fonts", "TAHOMA.TTF");最终效果:...
WuThreat身份安全云-TVD每日漏洞情报-2023-10-12
漏洞名称:curl SOCKS5 堆溢出漏洞(CVE-2023-38545) 漏洞级别:高危 漏洞编号:CVE-2023-38545,CNVD-2023-75809 相关涉及:cURL libcurl >7.69.0,<8.3.0 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-25382 漏洞名称:Apache H…...
sobel边缘检测算法
Sobel边缘检测算法是一种常用的图像处理技术,用于检测图像中的边缘和轮廓。该算法基于离散卷积操作,通过对图像进行滤波来寻找图像中灰度值的变化。Sobel算子是一种常用的卷积核,用于检测图像中的垂直边缘和水平边缘。以下是Sobel边缘检测算法…...
Kotlin中抽象类与接口
Kotlin 中的抽象类和接口是面向对象编程中的重要概念,它们提供了一种用于定义和组织代码的方式。在下面的代码示例中,我们将介绍 Kotlin 中的抽象类和接口,并给出相应的示例。 抽象类 抽象类是一种不能被实例化的类,它仅用作其他…...
解决osg绘制场景时因Z冲突导致重影或闪烁等不正常情况
目录 1. 问题的提出 2. Z冲突(z-fighting)简介 2.1. Z冲突(z-fighting)产生的原因 2.2. 如何消除Z冲突(z-fighting) 3. 代码实现 1. 问题的提出 今天绘制了一个棋盘格,鼠标在棋盘格上单击…...
adb 获取 Android 设备中已安装的 apk 文件
前言 今天发现手机上一个应用在应用商店已经搜索不到了,想把其推荐给朋友使用,发现不知道从哪里找原始的 apk 安装文件,记录一下。 如何提取 apk 两种方法 MT管理器导出 可以使用 MT管理器(Android 平台逆向神器),它有个 安装…...
学习记录683@类别不平衡问题解决的基本策略之再缩放的数学解释
什么是类别不平衡问题 分类学习方法都有一个共同的基本假设,即不同类别的训练样例数目相当。如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。例如有998个反例,但正例只有2个…...
2023App测试必掌握的核心测试:UI、功能测试
一、UI测试 UI即User Interface (用户界面)的简称。UI 设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由、充分体现软件的定位和特点。手机APP从启动界面开始, 到运行过程,直至退出,…...
华为荣耀手机,开启开发者选项,hbuilder调试依然找不到
我的手机是华为荣耀50,其他华为手机不知道是不是这个问题哦 解决办法:usb配置,选择音频来源 然后就可以了...
【C++】特殊类实现
一、请设计一个类,不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝, 只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 将拷贝构造函数与赋值运算符重载只声明不定义…...
代码随想录打卡第四十四天|● 01 二维背包问题 ●一维背包问题-滚动数组 ● 416. 分割等和子集
什么是01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 01背包的模板 二维dp数组 dp数组的含义 dp[i][j]含义下标为【0-i】之间…...
燃气管网智能巡检系统
燃气管网维护工作繁杂,涉及人员、资源、巡检等,稍一疏忽就会使我们的工作陷入被动,可见启用燃气管网智能巡检系统是很有必要的。 燃气管网智能巡检系统综合管理智能平台,可对燃气管网数据的统一管理,实现对日常巡查、养…...
【微信小程序开发】运用WXS进行后台数据交互
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于小程序的相关操作吧 一.wxs是什么 WXS是指"微信小程序云开发"(WeChat Mini Program Cloud Development),是由微信…...
屏幕录像推荐:Apeaksoft Screen Recorder 中文 for mac
Apeaksoft Screen Recorder 是一款功能强大的屏幕录制软件,它允许用户在 Windows 和 Mac 系统上捕捉和录制屏幕活动。无论是记录游戏过程、创建教学视频、制作演示文稿还是捕捉在线流媒体内容,该软件都提供了丰富的功能和工具。 以下是 Apeaksoft Scree…...
ALPHA开发板网络方案说明
一. 简介 正点原子 ALPHA开发板,包括我们移植的 Uboot,都是参考了 NXP(恩智浦)官方的开发板的。 I.MX6UL/ULL 内部有个以太网 MAC 外设,也就是 ENET ,需要外接一个 PHY 芯片来实现网络通信功能&#…...
[Ubuntu 20.04] HEIF图像格式与libheif库及其工具的使用
一、HEIF图像格式 HEIF 是一种高效的图像文件格式,它由 MPEG(Moving Picture Experts Group)组织制定。相较于传统的 JPEG 格式,HEIF 提供了更好的图像质量和更高的压缩率。下面是对 HEIF 格式的详细解析: 图像编码技术:HEIF 使用先进的编码技术来实现更高效的图像压缩。…...
AI驱动的未来:探索人工智能的无限潜力 | 开源专题 No.39
这一系列开源项目代表着多个领域的最新技术成果,包括深度学习、自然语言处理、计算机视觉和分布式训练。它们共同的特点是致力于教育、资源分享、开源精神、多领域应用以及性能和效率的追求,为广大开发者、研究者和学生提供了宝贵的工具和知识࿰…...
vs中C++编译未生成exe
1、新建空工程,添加main.h文件至“头文件”文件夹中,添加mian函数及实现 2、编译工程未有任何提示,不报错,不生成exe,无法执行 对比新建控制台程序发现.vcxproj文件中引用main.h文件为 无法生成: <I…...
在PC上畅玩Switch游戏:Ryujinx模拟器的终极完整指南
在PC上畅玩Switch游戏:Ryujinx模拟器的终极完整指南 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上体验《塞尔达传说:旷野之息》的震撼画面…...
告别本地跑不动:用AutoDL廉价GPU服务器训练YOLOv8模型的完整开销与效率对比
告别本地跑不动:用AutoDL廉价GPU服务器训练YOLOv8模型的完整开销与效率对比 作为一名长期在本地GTX 1060显卡上挣扎的计算机视觉开发者,每次看到YOLOv8论文中那些令人心动的性能指标时,总会被现实中的显存不足警告和漫长的训练时间打回原形。…...
Docker Rootless模式深度体验:它真的能替代传统Docker吗?聊聊那些官方没明说的限制
Docker Rootless模式技术评估:生产环境适配性全景分析 当容器技术逐渐成为现代基础设施的标配,安全隔离的短板却始终如达摩克利斯之剑高悬。传统Docker守护进程以root权限运行的架构设计,使得容器逃逸漏洞可能演变为整个宿主机的灾难。Rootle…...
MTK平台射频校准背后的工具箱全景:除了ATE,这些工具(META、CCT、Catcher)你都会用吗?
MTK平台射频校准工具箱全景:从ATE到全流程协同工具链深度解析 在MTK平台的硬件研发与生产测试中,射频校准是确保设备无线性能达标的关键环节。但很多工程师往往只关注ATE(自动测试设备)这一单一工具,却忽略了MTK提供的…...
终极免费编程游戏指南:如何通过CodeCombat从零掌握编程技能
终极免费编程游戏指南:如何通过CodeCombat从零掌握编程技能 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat CodeCombat是一款革命性的编程学习游戏,它巧妙地将编程知识融入…...
ChatGPT Images 2.0 功能大提升,但测试中仍出现这些错误!
1. ZDNET 的关键观点是什么? ChatGPT Images 2.0 能生成准确的文本和可用的图形,还能匹配包括 ZDNET 视觉风格在内的品牌样式,但仍会出现错误,需要人工审核。本周早些时候,OpenAI 推出了其全新的图像生成引擎 ChatGPT …...
Python DXF自动化处理:解决CAD图纸批量操作的5大痛点
Python DXF自动化处理:解决CAD图纸批量操作的5大痛点 【免费下载链接】ezdxf Python interface to DXF 项目地址: https://gitcode.com/gh_mirrors/ez/ezdxf ezdxf是Python生态中功能最全面的DXF文件处理库,为开发者提供了从R12到R2018全版本DXF文…...
AltSnap:Windows窗口管理革命,5分钟掌握高效桌面操作
AltSnap:Windows窗口管理革命,5分钟掌握高效桌面操作 【免费下载链接】AltSnap Maintained continuation of Stefan Sundins AltDrag 项目地址: https://gitcode.com/gh_mirrors/al/AltSnap 你是否曾在Windows中为精确点击窗口标题栏而烦恼&#…...
扫雷-简单版-详细版-C语言版
文章目录扫雷的框架搭建扫雷游戏的内部实现扫雷数组的创建扫雷的初始化函数扫雷的打印函数扫雷的设置雷函数扫雷的排雷函数扫雷的define的内容扫雷的测试方法扫雷的最终实现和全部文件展示总结这里是think的博客 希望可以一起交流知识,一起think 今天我们继续来学习…...
嵌入式C如何扛住300KB模型推理负载?:ARM Cortex-M7上量化+算子裁剪实战全链路拆解
更多请点击: https://intelliparadigm.com 第一章:嵌入式C与轻量级大模型适配的底层挑战全景 在资源受限的MCU(如ARM Cortex-M4/M7、ESP32)上部署轻量级大模型(如TinyLlama、Phi-3-mini、Qwen2-0.5B量化版࿰…...
