Java基础知识总结(80)

embedded/2024/9/22 11:01:35/

CLH释放锁的过程

线程A执行完临界区代码后开始unlock(释放)操作,设置nodeA的前驱引用为null(方便垃圾回收器回收),锁状态locked为false。

线程B执行抢到锁并且完成临界区代码的执行后,开始unlock(释放)操作,设置nodeB的前驱引用为null,锁状态locked为false。

线程C执行抢到锁并且完成临界区代码的执行后,开始unlock(释放)操作,设置nodeC的前驱引用为null,锁状态locked为false。

AQS解读

AQS是CLH队列的一个变种,主要原理和CLH队列差不多,AQS队列内部维护的是一个FIFO的双向链表,这种结构的特点是每个数据结构都有两个指针,分别指向直接的前驱节点和直接的后继节点。所以双向链表可以从任意一个节点开始很方便地访问前驱节点和后继节点。每个节点其实是由线程封装的,当线程争抢锁失败后会封装成节点加入AQS队列中;当获取锁的线程释放锁以后,会从队列中唤醒一个阻塞的节点。

cs自旋时,往队列末尾添加。添加完成后,自旋获取前一个节点的状态,判断前一个节点有没有释放锁,没有释放继续获取,获取到则执行同步代码块,获取不到该线程则处于死锁状态。

AQS执行流程

1、线程在获取锁失败后会被封装成节点放入同步队列的队尾,需要CAS设置

2、自旋判断前驱节点是不是头结点,如果是就获取同步状态,获取失败进入阻塞状态直到被头结点唤醒

3、获取成功,将持有同步状态的线程所在的节点设置为头节点

4、头节点线程完成任务后,释放了同步状态,然后会唤醒它的后继节点,同时后继节点的线程被唤醒后还需要检查自己的前驱节点是不是头节点


http://www.ppmy.cn/embedded/24885.html

相关文章

网络安全(黑客)—-2024自学手册

一、什么是网络安全 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性…

Vue笔记 4

内置指令 1.v-text_指令 我们学过的指令: ​ v-bind : 单向绑定解析表达式, 可简写为 :xxx ​ v-model : 双向数据绑定 ​ v-for : 遍历数组/对象/字符串 ​ v-on : 绑定事件监听, 可简写为 ​ v-if : 条件渲染(动态控制节点是否存存在&#xff0…

软件需求管理过程性规程指导文件(Word原件)

在软件开发的生命周期中,需求沟通与分析是一个至关重要的环节。很多项目失败的原因都可以归结为需求理解不透彻或者需求变更控制不当。因此,加强需求调研和软件需求分析的质量,是确保软件项目成功的关键。 软件全套精华资料包清单部分文件列表…

富格林:利用正规技能规避黑幕欺诈

富格林悉知,尽管现在现货黄金市场存在较大的盈利潜力,但也不是随随便便的操作就可以带来收益的,关键在投资者是否掌握合理正规的操作技能,并且是否具备戒备黑幕欺诈防备风险的能力,如果不小心落入黑幕欺诈陷阱中&#…

未来Agent AI智能体的角色与挑战

目录 前言1 技术进步与创新1.1 自我优化与知识积累1.2 应用领域与潜力1.3 决策透明性与可解释性挑战及其解决方案 2 伦理与法律规范2.1 隐私与数据处理2.2 决策与道德抉择2.3 法律规范与监管机制 3 经济与就业市场3.1 生产力与效率提升3.2 就业岗位变化与挑战3.3 智能体时代的的…

数据准备——词元化(分词)

词元化(分词) BPE 分词WordPiece 分词Unigram 分词分词器的选用词元化(Tokenization)是数据预处理中的一个关键步骤,旨在将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据。传统自然语言处理研究(如基于条件随机场的序列标注)主要使用基于词汇的分…

MogDB如何兼容Oracle的管道函数

在之前很多数据库国产化改造项目中,我们遇到了很多难题,其中一个难点在于重度使用Oracle的一些用户使用了大量的管道函数(pipeline)。在之前的版本中,由于MogDB还不支持pipeline,因此给我们造成了不小的麻烦…

python生成随机验证码图片+噪声

参数:图片宽高、验证码个数,文字大小 def check_code(width90, height30, length4, font_size26):code []from PIL import Image, ImageDrawimg Image.new(modeRGB, size(width, height), color(255, 255, 255))draw ImageDraw.Draw(img, modeRGB)def…