ReentrantLock底层原理

ReentrantLock

在这里插入图片描述

public ReentrantLock() {sync = new NonfairSync();
}public ReentrantLock(boolean fair) {sync = fair ? new FairSync() : new NonfairSync();
}

ReentrantLock 的默认实现是非公平锁,实际上 ReentrantLock 中的方法,几乎都让 sync 实现

实现原理

  • lock原理
    compareAndSetState(0,1),尝试将state从0=>1,成功,设置exclusiveOwnerThread=当前线程,否则tryAcquire根据 state 再次尝试获取,如果当前线程为exclusiveOwnerThread获得锁的线程,则state++(可重入),否则返回false。获取当前节点的前驱节点,tryAcquire,失败将前驱节点的waitStatus设为-1,阻塞直到拥有锁的线程释放。

在这里插入图片描述

  • unlock原理
    tryRelease,state–,更新state,直到state=0 —> setExclusiveOwnerThread(null),返回true,释放锁,唤醒阻塞的线程(可重入)。

释放锁的实现是不公平的,如果在 AQS队列中,head唤醒了后继节点竞争锁,同时又有一个线程也要竞争锁,那么它们都参与竞争锁,如果被唤醒的线程竞争失败,则再次阻塞,等待下次锁释放。

在这里插入图片描述

非公平锁的实现原理:刚来的线程可以和阻塞队列中唤醒的线程一起竞争,而不需要进入 AQS队列 中排队获取锁。

在这里插入图片描述
获取不到锁的线程进入 AQS队列中阻塞等待,直到被唤醒,如果期间被打断,设置打断标记为 true,但是当前线程仍在AQS队列中,所以 ReentrantLock 是不可打断的。

  • 公平锁的实现与非公平锁的实现主要是 tryAcquire 方法的实现
public final boolean hasQueuedPredecessors() {Node t = tail; Node h = head;Node s;return h != t &&((s = h.next) == null || s.thread != Thread.currentThread());
}
public final boolean hasQueuedPredecessors() {Node t = tail; Node h = head;Node s;return h != t &&((s = h.next) == null || s.thread != Thread.currentThread());
}

当AQS队列中有多个节点(线程阻塞),并且 如果第一个等待被唤醒的线程==null或第一个等待被唤醒的线程不是当前尝试获取锁的线程,返回true。则无法获取锁。

实际上就是对AQS队列中和外部尝试竞争锁的线程进行判断,即必须在AQS队列中排队获取锁

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

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

相关文章

springboot高校运动会信息管理系统设计与实现-计算机毕业设计源码92968

摘 要 本论文介绍了一个高校运动会信息管理系统的设计和实现过程。首先是高校运动会的需求分析和可行性分析,通过比较运动会的各个工作流程,确定了系统的数据流程和数据库结构,然后介绍了高校运动会信息管理系统开发所使用的软件开发工具&…

Java实现数据结构——顺序表

目录 一、前言 二、实现 2.1 增 2.2 删 2.3 查 2.4 改 2.5 销毁顺序表 三、Arraylist 3.1 构造方法 3.2 常用操作 3.3 ArrayList遍历 四、 ArrayList具体使用 4.1 杨辉三角 4.2 简单洗牌算法 一、前言 笔者在以前的文章中实现过顺序表 本文在理论上不会有太详细…

TCP是如何保证可靠传输的

TCP(传输控制协议)通过多种机制来保证数据的可靠传输,以下是TCP确保可靠性的主要特点: 数据包编号: TCP给每个字节的数据分配一个序号,确保数据能够按照正确的顺序被接收。 确认应答(ACK&#x…

vscode侧边栏错乱重制

vscode 重制命令面板 View: Reset View Locations

13_1 Linux 邮件服务与NTP时间服务

13_1 Linux 邮件服务与NTP时间服务 文章目录 13_1 Linux 邮件服务与NTP时间服务[toc]1. 邮件服务器2. NTP时间服务器 1. 邮件服务器 邮件服务器的作用: 为用户提供电子邮箱存储空间(用户名邮件域名)处理用户发出的邮件 —— 传递给收件服务器…

三星系统因何而成?或许是因为吞噬了第四颗恒星

相比于其他的类似星体,这个特殊的三星系统拥有更大更紧密的星体。 三星 天文学家发现了前所未见的三星系统。相比于其他典型的三星系统,这一三星系统拥有更大的体积,并且排列也更加紧密,这也使得这一系统更加特别。科学家推测&am…

【题解】—— LeetCode一周小结23

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结22 3.分糖果 II 题目链接:1103. 分糖果 II 排排坐…

MySQL-数据处理(1)

029-数据处理函数之获取字符串长度 select length(我是Cupid); select char_length(我是Cupid);concat (concatenate) select concat(cu, pid, so, handsome);030-去除字符串前后空白-trim select trim( a b c );select trim(leading 0 from 000110); select t…

C++设计模式---策略模式

1、介绍 策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的内部算法。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变…

USB转I2C转SPI芯片CH341

CH340与CH341区别 CH340主要用于将USB转换为各种串口,CH340H和CH340S可以实现USB转并口。 CH341和340的不同之处在于CH341提供I2C和SPI接口,方便连接到I2C或SPI总线操作相关的器件。 CH341主要有6种封装。见表1. CH341T SSOP-20封装和丝印 USB 总线转接…

【服务实现读写分离】

文章目录 什么是读写分离基于Spring实现实现读写分离项目中常用的数据源切换依赖包 什么是读写分离 服务读写分离(Service Read-Write Splitting)是一种常见的数据库架构设计模式,旨在提高系统的性能和可扩展性。通过将读操作和写操作分离到…

分布式事务AP控制方案(上)

分布式事务控制方案 本篇文章给出一种要求高可用性(AP思想)的分布式事务控制方案 下篇新鲜出炉:点我查看 分布式事务控制方案1、业务背景2、本地消息表的设计3、对消息表的操作4、任务调度5、任务流程控制的抽象类6、课程发布的实现类7、总…

[力扣题解] 236. 二叉树的最近公共祖先

题目:236. 二叉树的最近公共祖先 思路 代码 用深度搜索的思想(好吧,前序、中序、后序都是深搜思想),保存寻找路径,看看找到2个节点的路径的重合部分,就可以找到最近公共祖先; /*…

代理IP使用api接

代理IP使用API接口,通常是指通过API接口获取代理IP地址,并将其应用于爬虫、数据采集、反爬虫等场景中,以提高数据采集效率和保护数据采集安全。 一般来说,代理IP提供商会提供API接口文档和SDK供开发者使用。你需要先注册并登录代…

硬件工程师的蜗牛成长路

一名合格的硬件工程师,需要掌握的知识有很多,知识点积累不是一蹴而就,而是细水长流,螺旋提升,不急,慢慢来,想掌握的都能掌握,就让时间来见证个人的成长路径。 ---大青山 2024/6/10 …

diffusers 再次继续训练LoRA时,如何导入已有的LoRA权重

我们通常会有微调扩散模型的需求,比如对LoRA进行训练来实现对Stable diffusion模型的微调。 但是有时候我们需要复用先前训练好的LoRA参数来继续进行训练。此时并不需要我们重新使用API向U-Net网络加载LoRA对应的adapter参数权重,我们可以直接通过diffu…

优质免费的 5 款翻译 API 接口推荐

当谈到翻译API时,我们通常指的是一种编程接口,它允许开发者将文本从一种语言翻译成另一种语言。这些API通常由专业的翻译服务提供商提供,如谷歌翻译 API、实时翻译API、腾讯翻译API、DeepL翻译API、Azure翻译API等。 这些API通常提供多种语言…

MFC 教程-文本框失去焦点处理

MFC 教程-文本框失去焦点处理 一、MFC 文本框控件概述 1.1 定义与应用场景 在 MFC(Microsoft Foundation Class)中,文本框控件(CEdit)是一个常用的用户界面元素,用于接收用户输入的文本信息。它广泛应用于各种窗口应用程序中,从简单的登录界面到复杂的数据输入表单。 …

基于springboot的欢迪迈手机商城源码数据库

现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本欢迪迈手机商城就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&#xf…

使用Redis的优势以及会引发的问题

优势 ①使用redis代表着高性能还有高并发,高性能很好理解,redis会缓存我们访问的数据。他是基于内存的,第一次访问数据库我们可能需要800ms,但是访问后如果使用redis进行缓存,第二次乃至后面访问相同的数据就只需要去…