ReentrantLock锁与AQS的联系

news2024/11/28 15:47:23

请先看——————>AQS的简单说明

        ReentrantLock底层是基于AQS实现的,在并发编程中可以实现公平锁非公平锁来对同步资源进行控制,默认是非公平锁,并且是可重入锁。  

1.ReentrantLock的体系关联结构

2.构造方法

 可以发现ReentrantLock的非公平锁和公平锁实际是NonfairSync()和FairSync()这两个类来实现的。

3.非公平锁和公平锁的实际区别

因为sync中的lock()方法是抽象方法,所以NonfairSync和FairSync类里面会重写lock()方法。  

 

        发现在调用lock方法的唯一区别就是,非公平锁会先尝试CAS去修改状态来抢占锁,如果修改成功,则抢占锁成功并返回,如果没有修改成功,则调用acquire(1)方法。而公平锁直接是调用acquire(1)方法。  

4.非公平锁的实现

4.1tryAcquire()方法

进入到acquire方法后,先调用tryAcquire(1)方法............  

         发现此方法内还是要进行尝试抢占锁,如果此时正好state状态为0了,那么CAS进行尝试修改状态,如果成功直接返回。还会判断正在占用锁的线程和当前线程是不是同一个,如果是,则证明是要重入锁,也返回true,如果这两个都没有成功,则返回false。

4.2公平锁和非公平锁在tryAcquire方法中的区别

        公平锁的tryAcquire()方法中,就算此刻状态变为0了,不会直接CAS,而是会先判断FIFO队列中是否有等待的线程,如果有,那么就不进行CAS操作了,因为要保证公平!  

4.3addwaiter()方法

需要注意的是,在双向链表中,第一个结点为虚结点(也叫做哨兵结点),只是占位用的,所以真正有用的数据结点是从第二个结点开始的。

进入到addwaiter()方法,当双向链表中尾指针为null时,需要进行初始化,创建虚结点并将封装线程的Node结点入队。当尾指针不为null时,将封装线程的Node结点入队,并将尾指针指向Node结点。

执行完毕后返回加入的Node结点。

4.4acquireQueued()方法

 

        我们将Node入队之后,执行acquireQueued方法,先拿到Node的前驱结点,判断是否为虚拟头结点,如果是,那么直接尝试tryAcquire()去获取锁,如果获取到了,将虚拟头结点指向Node,原来的虚拟头结点指向null,等待GC回收即可,但是如果Node的前驱结点不是虚拟头结点或没获取到锁,那么修改其前驱结点的状态直到为SIGNAL,前驱结点的状态修改完后,然后利用LockSuppor.park()将当前Node进行阻塞。

        那现在我们的好奇心飙升了,加入的Node将它的前驱结点状态修改了,然后自己又阻塞了,那么Node什么时候唤醒unPark呢?一个线程占用锁后,调用了unlock()方法解锁,那么unlock()方法有什么猫腻呢?

4.5unlock()方法

 

4.6unlock后发生的一些事情

        一个线程释放锁后,会唤醒虚拟头结点后的第一个结点,唤醒之后,还在acquireQueued()方法中,然后进行for循环,因为此时锁此时已经释放了,此时唤醒的Node的前驱就是虚拟头结点,调用tryAcquire()方法去获取锁,获取到后将虚拟头结点指向Node,原来的虚拟头结点指向null,等待GC回收即可。队列中一直后面的线程Node就还处于阻塞的状态。

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

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

相关文章

Spring Security——基于前后端分离项目的使用(安全框架)

1.简介 Spring Security有一个过滤器链,也就是说原本在拦截器和过滤器里面做的事都可以用Spring Security完成,比如验证token和将用户id存入线程上下文局部变量等等。 入门案例 创建项目并勾选依赖 最基本的要这两个依赖即可 新建一个Controller层的…

Dubbo v Spring Cloud:两大技术栈如何选型?

Java全能学习面试指南:https://javaxiaobear.cn 提到微服务开源框架,不可不说的是 Dubbo 和 Spring Cloud,这两大框架应该是大家最熟悉的微服务解决方案,也是面试中的热点。今天我们梳理下 Dubbo 和 Spring Cloud 的应用特性&…

win10 U盘安装教程

一年内,第三次重装电脑了,我必须要写一份教程了。从制作U盘开始,到重装系统,全部都记录一下,以备不时之需。 首先,找一个U盘,如果U盘内有需要文件,请自行备份,因为这个U盘…

“双节”出游,VR智慧景区让你的旅游更具“心价比”

中秋国庆八天长假落幕,全国旅游消费市场人气旺、活力足,黄金周旅游消费的变化凝结成为新的文旅趋势,更多的游客会选择人少、景美、价优的错峰游,为了享受品质游玩,VR全景展示为众多游客带来旅游新体验,让你…

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiLSTM开普勒算法优化卷积双向长短期记忆神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiLST…

洗地机怎么选?2023年洗地机推荐

洗地机结合洗地、拖地、扫地的功能,在日常生活中备受关注,他能帮助我们更加节省时间和节省体力,但是面对参差不齐的洗地机市场如何选到适合自己的呢,下文整理了几款非常值得入手的性价比型号,供大家选择参考。 一、CE…

SpringBoot项目创建

创建SpringBoot项目: 选择maven项目,选择Java版本 选择springboot版本(这里随便选择,后面会进行更改,用不到这么高的版本),选择所需要的对应工具。 然后下一步即可。 配置修改 ,结构…

7346-2015 控制电机基本外形结构型式

声明 本文是学习GB-T 7346-2015 控制电机基本外形结构型式.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了控制电机的机座号、外形及安装尺寸、轴伸型式、出线方式、标记及铭牌。 本标准适用于各类控制电机(以下简称电机),其…

漏洞复现--中远麒麟堡垒机SQL注入

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

性能监控-微服务链路追踪skywalking搭建

中文文档:hong设置 (skyapm.github.cio) 参考:微服务链路追踪SkyWalking的介绍和部署_skywalking部署_技术闲聊DD的博客-CSDN博客 参考:链路追踪SkyWalking整合项目以及数据持久化_skywalking 持久化_技术闲聊DD的博客-CSDN博客 Liunx部署skywalking以…

python每日一练(2)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

【debian 12】:debian系统切换中文界面

目录 目录 项目场景 基础参数 原因分析 解决方案 1.ctrlaltT 打开终端 2.查询当前语言环境(我的已经设置成了中文 zh_CN.UTF-8) 3.打开语言配置界面 4.最后一步:重启 不要放弃任何一个机会! 项目场景: 这两…

项目进展(十)-解决ADS1285在调试时出现的问题

一、解决大坑 在项目进展(九)-完善ADS1285代码这边博客中,看似解决了问题,可以去读数据,但是其实是给自己挖大坑,这边博客就是来填坑的。   首先呢,上篇博客说的是用0x12指令来读取数据&#…

Nebula图数据库

文章目录 摘要引言Nebula图数据库概述Nebula图数据库架构Nebula命令和语法详解连接到Nebula图数据库创建图空间使用图空间创建图插入节点数据插入边数据查询节点数据查询边数据 高级用法索引图计算数据导入和导出事务管理数据备份和恢复安全性管理 Nebula使用实例结论参考文献 …

SwiftUI Spacer() onTapGesture 无法触发

问题:点击这个黑色区域不会 print,黑色区域看上去刚好是 Spacer() 占据的区域 解决办法:不使用 onTapGesture,用 Button 包裹一下 Code: import SwiftUIstruct TestTap: View {var body: some View {NavigationStack {List {Sect…

【框架风格】解释器模式

1、描述 解释器框架风格(Interpreter Framework Style)是一种软件架构风格,其核心思想是构建一个解释器(Interpreter)来解释并执行特定领域或问题领域的语言或规则。以下是解释器框架风格的一些特点: 1. 领…

parameterType后面报红

第一种 :parameterType后面报红,点击file——settings 第二种:写全类名

三十、【进阶】B树的演变过程

1、索引结构 (1)二叉树 (2)B-Tree树 B-Tree树最大度数为5,代表每一个节点最多存储4个key(每个节点最多存储4个数据),5个指针(可以指向5个子节点)。 2、演变过程(最大度数为5) &…

C++ 33.学习C++的意义-狄泰软件学院

一些历史 UNIX操作系统诞生之初是直接用汇编语言编写的随着UNIX系统的发展,汇编语言的开发效率成为瓶颈,所以需要一个新的语言替代汇编语言1971年通过对B语言改良,使其能直接产生机器代码,C语言诞生UNIX使用C语言重写&#xff0c…

音频格式怎么转换成mp3?

音频格式怎么转换成mp3?那是因为很多时候我们在使用手机录音或下载平台音频时,可能会遇到无法打开或播放的情况。这通常是因为我们所使用的音频格式不被通用的播放器所支持,导致了无法打开的问题。为了解决这个问题,我们需要将音频…