12. AbstractQueuedSynchronizer之AQS

news2024/11/19 17:29:28

12.1 前置知识
● 公平锁和非公平锁
○ 公平锁:锁被释放以后,先申请的线程先得到锁。性能较差一些,因为公平锁为了保证时间上的绝对顺序,上下文切换更频繁
○ 非公平锁:锁被释放以后,后申请的线程可能会先获取到锁,是随机或者按照其他优先级排序的。性能更好,但可能会导致某些线程永远无法获取到锁
● 可重入锁
○ 也叫做递归锁,指的是线程可以再次获取自己的内部锁,比如一个线程获取到了对象锁,此时这个对象锁还没有释放,当其想再次获取这个对象锁的时候还是可以获取的,如果不可重入的话,会导致死锁。
● 自旋思想
○ 当线程请求锁时,如果锁已经被其他线程持有,那么该线程会不断地重试获取锁,而不是被挂起等待,这种不断尝试获取锁的行为称为自旋
● LockSupport
○ 一个工具类,用于线程的阻塞和唤醒操作,类似于wait()和notify()方法,但是更加灵活和可控
○ 提供了park()和unpark()两个静态方法用于线程阻塞和唤醒操作。
○ 优点在于可以在任意时刻阻塞和唤醒线程而不需要事先获取锁或监视器对象。
● 数据结构之双向链表
○ 双向链表(Doubly Linked List)是一种常见的数据结构,它是由一系列结点(Node)组成的,每个结点包含三个部分:数据域、前驱指针和后继指针。其中,数据域存储结点的数据,前驱指针指向前一个结点,后继指针指向后一个结点。通过这种方式,双向链表可以实现双向遍历和插入、删除操作。
● 设计模式之模板设计模式
○ 模板设计模式是一种行为型设计模式,定义了一种算法的框架,并将某些步骤延迟到子类中事先,这种设计模式的主要目的是允许子类在不改变算法结构的情况下重新定义算法中的某些步骤。
○ 优点是能够提高代码复用性和可维护性。

12.2 AQS入门级别理论知识
12.2.1 是什么?
抽象的队列同步器
在这里插入图片描述
技术解释
● 是用来实现锁或者其他同步器组件的公共基础部分的抽象实现
● 是重量级基础框架及整个JUC体系的基石,只要用于解决锁分配给”谁“的问题。
● 整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态

在这里插入图片描述
在这里插入图片描述
12.2.2 AQS为什么是JUC内容中最重要的基石
和AQS有关的
在这里插入图片描述
ReentrantLock
在这里插入图片描述
CountDownLatch
在这里插入图片描述
ReentrantReadWriteLock
在这里插入图片描述
Semaphore
在这里插入图片描述
● 进一步理解锁和同步器的关系
○ 锁,面向锁的使用者:定义了程序员和锁交互的使用层API,隐藏了实现细节,你调用即可
○ 同步器,面向锁的实现者:Java并发大神DoungLee,提出了统一规范并简化了锁的实现,将其抽象出来,屏蔽了同步状态管理、同步队列的管理和维护、阻塞线程排队和通知、唤醒机制等,是一切锁和同步组件实现的----公共基础部分

12.2.3 能干嘛?
加锁会导致阻塞------有阻塞就需要排队,实现排队必然需要队列
● 抢到资源的线程直接使用处理业务,抢不到资源的必然涉及一种排队等候机制。抢占失败的线程继续去等待(类似于银行办理窗口都满了,暂时没有受理窗口的顾客只能去候客区排队等待),但等候线程仍然保留获取锁的可能且获取锁流程仍在继续(候客区的顾客也在等着叫号,轮到了再去受理窗口办理业务)
● 既然说到了排队等候机制,那么就一定会有某种队列形成,这样的队列是什么数据结构呢?
○ 如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中,这个队列就是AQS同步队列的抽象表现。它将要请求共享资源的线程及自身的等待状态封装成队列的节点对象(Node),通过CAS、自旋以及LockSupport.park()的方式,维护着state变量的状态,使其达到同步的状态。
在这里插入图片描述
12.2.4 小总结
AQS同步队列的基本结构
在这里插入图片描述
12.3 AQS源码分析前置知识储备
12.3.1 AQS内部体系架构图
在这里插入图片描述
2.3.2 AQS内部体系架构----AQS自身
● AQS的int类型变量state
○ AQS的同步状态State成员变量
在这里插入图片描述

○ 银行办理业务的受理窗口状态
■ 零就是没人,自由状态可以去办理
■ 大于等于1,有人占用窗口,等着去
● AQS的CLH队列
○ CLH(三个大牛的名字组成)队列为一个双向队列
在这里插入图片描述
○ 银行候客区的等待顾客
● 小总结
○ 有阻塞就需要排队,实现排队必然需要队列
○ State变量+CLH双端队列

● Node此类的讲解
○ 内部结构
在这里插入图片描述
属性说明
在这里插入图片描述
12.4 AQS源码深度讲解和分析
12.4.1 ReentrantLock的原理
Lock接口的实现类,基本都是通过聚合了一个队列同步器的子类完成线程访问控制的

在这里插入图片描述
12.4.2 从最简单的lock方法开始看看公平和非公平
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
公平锁和非公平锁的lock()方法唯一的区别就在于公平锁在获取同步状态时多了一个限制条件:hasQueuedPredecessors()-----公平锁加锁时判断等待队列中是否存在有效节点的方法
12.4.3 以非公平锁ReentrantLock()为例作为突破走起—方法lock()
对比公平锁和非公平锁的tryAcquire()方法的实现代码,其实差异就在于非公平锁获取锁时比公平锁中少了一个判断!hasQueuedPredecessors(),hasQueuedPredecessors()中判断了是否需要排队,导致公平锁和非公平锁的差异如下:
● 公平锁:公平锁讲究先来后到,线程在获取锁时,如果这个锁的等待队列中已经有线程在等待,那么当前线程就会进入到等待队列中;
● 非公平锁:不管是否有等待队列,如果可以获取到锁,则立刻占有锁对象。也就是说队列的第一个排队线程苏醒后,不一定就是排头的这个线程获得锁,它还需要参加竞争锁(存在线程竞争的情况下),后来的线程可能不讲武德插队夺锁了。
在这里插入图片描述
在这里插入图片描述
正式开始源码解读:
● lock()

在这里插入图片描述
在这里插入图片描述
acquire()

在这里插入图片描述
tryAcquire(arg)
在这里插入图片描述
○ return false:继续推进条件,走下一个方法
○ return true:结束
● addwaiter(Node.EXCLUSIVE)

在这里插入图片描述
○ 注意:在双向链表中,第一个节点为虚节点(也叫做哨兵节点),其实不存储任何信息,只是占位。真正的第一个有数据的节点,是从第二个节点开始的
○ 假如此时有线程C进入:
在这里插入图片描述
acquireQueued(addWeiter(Node.EXCLUSIVE), arg)-----坐稳队列
在这里插入图片描述
12.4.4 unlock()

在这里插入图片描述

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

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

相关文章

第58讲:Python编程中最难以理解的递归函数核心概念以及应用案例

文章目录 1.递归函数的概念2.递归函数的使用2.1.案例一2.1.1.需求描述2.1.2.使用常规的循环来实现2.1.3.使用递归函数实现 2.2.案例二2.2.1.需求描述2.2.2.使用常规的循环来实现2.2.3.使用递归函数实现 3.使用递归函数计算阶乘3.1.阶乘的概念3.2.使用递归函数实现阶乘的算法3.3…

分布式Profinet IO模块

PROFINET IO模块是一种用于工业自动化控制系统中的设备控制模块。它使用以太网技术,在现场设备和处理器/控制器之间提供快速、精确和可靠的数据交换。PROFINET IO模块通常是面向过程的,可以用于监测和控制工业过程中的各种设备和参数,如传感器…

Vue中使用editor.md(2):添加拖拽图片上传功能

0. 背景 在对editor.md简单使用后,希望添加图片拖拽或粘贴上传的功能。 简单使用参考:Vue中使用editor.md(1):简单使用 1. 实现 1.1 添加粘贴监听 // 使用axios import axios from /api/indexfunction initPasteDra…

什么是Vue的插件?如编写自定义 Plugin?

什么是Vue的插件? 在Vue开发中,我们经常需要使用一些第三方库或功能性模块,Vue插件就是一种将这些库或模块集成到Vue应用中的方式。插件是Vue.js提供的一种机制,用于扩展Vue的功能。插件通常用于封装某些特定的功能,例…

【AI人工智能】 你如果要使用最强大的语言模型,你还要有最精美的浏览器标签页iTab (2)

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享博主 🐋 希望大家多多支持一下, 我们一起进步!😄 🏅 如果文章对你有帮助的话,欢迎评论 💬点赞&#x1…

UnityA*导航算法,通俗易懂

首先A*寻路算法分为2D算法和3D算法,目前它甚至不如NAVMesh算法效率高。但NAVMesh不适用于2D,因此2D还是要靠A*算法来进行实现。 当前就来说说2D是如何实现的。 首先2DA*算法先要将地图划分成格子分块标记成二维数组 每个格子依据x,y&#xf…

又一新型技术全面铺开,高精度光刻机已突破壁垒,赶超只是时间

众所周知,光刻机是制造高精度芯片的关键步骤。 随着科技的不断进步,光刻机的精度和速度也在不断提高,使得我们可以制造出更小更精细的芯片,满足了人们对于高性能电子设备的需求。 我国的光刻机技术,国产大飞机&#x…

【华为OD机试真题2023B卷 JAVAJS】二维伞的雨滴效应

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 二维伞的雨滴效应 知识点递归树 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 普通的伞在二维平面世界中,左右两侧均有一条边,而两侧伞边最下面各有一个伞坠子,雨滴落到伞面,逐步流到伞坠处,会将伞坠的信息携…

UML类图(二)

相信希望,相信自己 上一章简单介绍了 设计模式的原则(一), 如果没有看过,请观看上一章 本文参考文章: 常见UML符号详解 UML (Unified modeling language) 统一建模语言,是一种用于软件系统分析和设计的语言工具, 它用于帮助软件开发人员进行…

强烈推荐协同办公的三个小工具

强烈推荐协同办公的三个小工具 这里给大家推荐三个可以用于协同办公的小软件工具。那么,什么是协同办公呢?直接下定义给个概念那就不好玩了,所以我直接推荐这么几个协同软件大家就懂了。 ONLYOFFICE办公软件 具体的软件截图我这里就不贴了&…

【Android】Frida Hook 文件读写操作

前言 在挖掘客户端漏洞的时候,通常会关注应用对什么文件进行了读写操作,当我们能控制被读的文件或观测到敏感写入的文件,通常可以造成一定危害。本文详细介绍了如何通过frida监控文件读写操作。 相关知识 1. 读写相关调用api 在Linux系统…

有哪些自媒体平台有播放量就会有收益?

自媒体是近年来兴起的一种新型媒体,指的是由个人或小团体通过互联网自行发布内容,通过社交媒体等渠道传播和推广的媒体形态。自媒体平台的出现,让更多人能够自由发表意见和观点,实现了信息的自由传播。同时,随着互联网…

跨平台.NET应用UI组件DevExpress XAF v22.2亮点 - 支持.NET 7

DevExpress XAF是一款强大的现代应用程序框架,允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计,开发人员可以选择内建模块,也可以自行创建,从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在新版中…

数据结构——二叉树基础结构篇(C语言)

引言 现在是北京时间2023年6月13日9点11分。从决定要开始减脂之后,饥饿总是伴随着我。一觉起来肚子咕咕叫,我还是想先把文章发了再吃第一餐。燕麦加蛋白粉几乎伴随了我大学的第一年早饭。昨天练了一个小时背,练背后还做了45分钟有氧。空腹训…

BeautifulPrompt:PAI推出自研Prompt美化器,赋能AIGC一键出美图

作者:曹庭锋、汪诚愚、吴梓恒、黄俊 背景 Stable Diffusion(SD)是一种流行的AI生成内容(AI Generated Content,AIGC)模型,能在文字输入的基础上生成各种风格多样的图像。在目前的AIGC方向&…

十五周算法训练营——普通动态规划(上)

今天是十五周算法训练营的第十一周,主要讲普通动态规划(上)专题。(欢迎加入十五周算法训练营,与小伙伴一起卷算法) 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那…

设计模式——适配器模式

1.定义 将一个类的接口转换成客户所希望的另一个接口,Adapter模式使得那些原本因为接口不兼容而不能一起工作的那些类可以一起工作。 2.使用场景 一般来说,适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷。应用这种模式算是“无…

驱动开发:内核LoadLibrary实现DLL注入

远程线程注入是最常用的一种注入技术,在应用层注入是通过CreateRemoteThread这个函数实现的,该函数通过创建线程并调用 LoadLibrary 动态载入指定的DLL来实现注入,而在内核层同样存在一个类似的内核函数RtlCreateUserThread,但需要…

【模型评估】AP 和他们的兄弟们:mAP、AP50、APs、APm、APl

AP是在目标检测任务中,尝尝被用于评估模型预测能力的指标。那AP是什么?为什么能够充当不同模型综合对比评测的公认指标呢? 在学习下文之前,混淆矩阵和ROC可以先了解下: 【模型评估】混淆矩阵(confusion_m…

世界中西医结合医学研究院一行莅临万民健康交流指导

为进一步发展中医药产业,深入挖掘中医药文化,坚持中西医并重,传承精华,守正创新,助力乡村振兴、促进乡村医疗产业发展。6 月 10 日 , 世界中西医结合医学研究院医学工程院院士罗先义 、谈家桢生命基金会主任…