ReentrantLock实现原理

news2024/11/13 10:35:19
  • ReentrantLock是基于AQS实现的可重入锁,比synchronized更灵活,可以设置超时时间,可以中断,支持公平和非公平锁两种方式。
  • 公平锁获取锁的方式:
    • 主要就是这三步

  • 第一步:tryAcquire 先尝试获得锁
    • 先获取state,情况一:如果state=0,那么说明当前没有线程占着锁,如果当前线程不需要排队,那么就可以尝试CAS修改state的状态,如果CAS修改成功,就说明抢锁成功,就把setExclusiveOwnerThread设置成当前线程。程序到这里就结束啦~
      • hasQueuedPredecessors()判定是否需要排队。官方解释,如果队列中有线程排在你前面,那你就需要排队;否则当前线程就在队列的头的位置,或者队列是空的,你就可以起CAS抢锁。保证了公平性!!!

  • 情况二:如果获得state!=0,但是被自己(当前线程占用),可以直接把state加1。程序到这里就结束啦~
  • 其他情况:都认为尝试获取锁失败。那就要走第二步。
  • 第二步:addWaiter 把当前线程当作节点,放到等待队列的尾部
  • 第三步:acquireQueued  无限循环执行排队操作,也就是阻塞线程,直到获得锁
    • 如果当前线程已经排在队列头部,就尝试获得锁。获得成功程序到这就结束啦~
    • 如果没有获得锁,就执行shouldParkAfterFailedAcquire ,如果排在当前线程前面的节点状态是signal,就返回true;如果排在前面的节点是CANCELLED,把前面等待状态是CANCELLED的全部清理掉,并把当前线程的前一节点设置成signal状态,就返回false(注意这里是无限循环,下次循环就会返回true);
      • 这里返回false的好处是当前线程不需要立刻进入等待状态,可以等其他条件变化后,再判断是否进行等待状态。其次返回false,也不需要走后面的park方法啦
    • 总之,这一步就是阻塞当前线程,排队等待,直到自己排到队首。
    • 那么问题来了,我怎么能排到队首?当一个线程释放锁的时候,它会将当前头节点的下一个等待节点设置为新的头节点,并且唤醒这个新的头节点。
  • 总结:公平锁lock的步骤简单讲就是,如果你不需要排队尝试获得锁,否则就排队阻塞直到获得锁。
  • 非公平锁
    • 非公平锁在一开始比公平锁多了一步CAS抢锁的步骤。通俗讲可以插队。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flux【真人模型】:高p高糊反向真实质感!网图风格的Lora模型,超逼真的AI美女大模型!

大家好,我是画画的小强 今天和大家分享一款基于Flux训练的网图风格的lora模型:墨幽-F.1-Lora-网图,该Lora模型由墨幽团队出品,旨在生成高p高糊的反向真实质感图片,而非真实摄影图片。不过,在自己出图过程中…

Linux操作系统 进程(3)

接上文 Linux进程优先级之后,我们了解到僵尸进程与孤儿进程的形成原因,既然是因为父进程没有接收子进程的退出状态导致的,那么我们该如何去获取子进程的退出状态呢?那本篇文章将围绕这个问题来解释进程。 环境 : vsco…

更高效的搜索工具,国内免费好用的AI智能搜索引擎工具

搜索引擎是我们获取信息的重要渠道,然而由于搜索引擎搜索结果存在较多的广告以及一些无关内容,这使我们的搜索效率变得更低效。小编就和大家分享几款国内免费好用的AI智能搜索工具,提高搜索效率。 1.开搜AI搜索 开搜AI搜索是一款基于深度学…

【学术会议:中国杭州,机器学习和计算机应用面临的新的挑战问题和研究方向】第五届机器学习与计算机应用国际学术会议(ICMLCA 2024)

您的学术研究值得被更多人看到! 在这里,我为您提供精准的会议推荐,包括水利土木工程、计算机科学、地球科学、机械自动化、材料与制造技术、经管金融、人文社科等主流学科相关领域的国际会议。快速的稿件录用和高效的检索服务将确保您的研究…

30个小米集团芯片工程师岗位面试真题

在竞争激烈的半导体行业,小米集团作为全球知名的科技公司,对于芯片工程师的选拔标准自然也是极为严格。本篇分享一份《30个小米集团芯片工程师岗位面试真题》,通过对这30道真题的深入分析,我们可以一窥小米对于芯片设计人才的期待…

缓存数据和数据库数据一致性问题

根据以上的流程没有问题,但是当数据变更的时候,如何把缓存变到最新,使我们下面要讨论的问题 1. 更新数据库再更新缓存 场景:数据库更新成功,但缓存更新失败。 问题: 当缓存失效或过期时,读取…

Web后端服务平台解析漏洞与修复、文件包含漏洞详解

免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国…

阿贝云评测:免费虚拟主机和免费云服务器体验分享

最近我有幸体验了阿贝云提供的免费虚拟主机和免费云服务器,在这里分享一下我的使用体验。首先我想说的是,阿贝云的服务真的很不错。他们提供的免费虚拟主机性能稳定,速度快,对于刚开始建站的小伙伴来说是一个很好的选择。免费云服…

技术美术百人计划 | 《5.1.1 PBR-基于物理的材质》笔记

1. PBR定义-基于物理的材质 PBR,或者用更通俗一些的称呼是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。 正因为基于物理的渲染目的便是为了使用一种更…

【Linux系统编程】第二十一弹---进程的地址空间

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、进程空间的地址 1.1、基本概念 1.2、代码分析 1.3、如何理解地址空间 1.4、进一步理解页表和写时拷贝 1.5、进一步理解…

基于SpringBoot+Vue+MySQL的智能物流管理系统

系统展示 系统背景 随着信息技术的飞速发展和电子商务的蓬勃兴起,智能物流管理系统的需求日益迫切。传统的物流管理方式已难以满足高效、精准、实时的管理需求。因此,基于SpringBoot、Vue和MySQL的智能物流管理系统应运而生。该系统旨在通过现代化的技术…

vue项目引入比较独特的字体的方法

引入字体的步骤 前言(步骤一)引入的文件OPPOSans-M.ttf,TencentSans-W3.ttf,TencentSans-W7.ttf,YouSheBiaoTiHei.ttf (步骤二)font.css(步骤三) 全局引入在使用的地方的展示效果展示 前言 公司这边开发一个可视化大屏,UI小姐姐设置了很多比…

2024年超好用的公司加密软件分享|十款企业防泄密软件推荐

在数字化时代,企业数据的安全性变得尤为重要。随着网络攻击和数据泄露事件的频发,企业需要采取有效的措施来保护敏感信息。加密软件作为一种重要的数据保护工具,能够帮助企业防止数据泄露和未经授权的访问。本文将为您推荐十款2024年超好用的…

Dockerfile部署xxljob

使用Dockerfile部署xxljob 1. 背景 我们在使用定时任务调度时,通常会使用xxljob容器化部署xxljob,通常使用 docker pull xuxueli/xxl-job-admin:2.4.0 拉取镜像并启动容器。这种方式对于x86架构服务器来说,没有任何问题。但是在arm架构的服…

什么是 IP 地址信誉?5 种改进方法

IP 地址声誉是营销中广泛使用的概念。它衡量 IP 地址的质量,这意味着您的电子邮件进入垃圾邮件或被完全阻止发送的可能性。 由于每个人都使用专用电子邮件提供商而不是直接通过 IP 地址进行通信,因此,这些服务可以跟踪和衡量发件人的行为质量…

玩机进阶教程-----MTK芯片机型 回读 备份 导出分区来制作线刷包 其中MT****_Android_scatter.txt的修改 分区的写入与否

在与一些小品牌机型定制系统过程中。其中一些机型定制导出分区制作线刷包。默认分区的写入与否要了解清楚。有些分区导出后在写入有可能会导致机型不开机或者卡第一屏的故障。这方面最基本的就是涉及mtk分区写入地址引导MT****_Android_scatter.txt的修改 通过博文了解 1----…

一文了解高速工业相机

超高速相机是工业相机的一种,一般高速相机指的是数字工业相机,其一般安装在机器流水线上代替人眼来做测量和判断,通过数字图像摄取目标转换成图像信号,传送给专用的图像处理系统。 超高速工业相机的采集速率> 50Gb/s&#xff…

AI取代程序员? or 成为10倍效能工程师!

Manuel Odendahl 是一位知名的人工智能和机器学习专家,尤其在计算机视觉和自然语言处理领域有显著贡献。他的研究涉及深度学习、图像识别和人机交互等方面,且在相关领域发表了多篇学术论文。 在这个人工智能快速发展的时代,程序员的工作方式正…

SpringCloud 基于 web 的只会养老平台

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计…

23:SPI二:W25Q64存储器模块的使用

W25Q64存储器模块的使用 1、W25Q64的简介2、模块内部结构2.1:引脚结构2.2:内部存储结构2.3:此模块的注意事项 3、程序模拟SPI读写W25Q644、片上外设SPI读写W25Q64 1、W25Q64的简介 其中最主要的特点就是掉电不丢失。 由上图所示&#xff1a…