synchronized锁升级及CAS和AQS简述

news2024/9/20 3:02:21

概述

为什么会有锁升级的步骤呢,假设没有这个步骤,多个线程竞争时,抢到锁的线程直接运行,其他的都直接sleep/wait,然后等第一个线程运行完成后,再由操作系统唤醒接下来的线程。这个一套动作下来就很费调度资源.

所以锁的升级相当于加了一层缓存,实在是竞争的很激烈,再由操作系统介入

平时分布式环境下控制并发都是用的redis中间件。
但在一些mini项目中对多线程的控制,简单操作可以用synchronized关键字来控制;

synchronized上锁时,锁的信息都放在对象头上,对象除了自己的数据外还有头部信息.

在这里插入图片描述

锁升级过程

锁的升级过程,其实就是线程争抢锁的过程;
第一个线程获取锁后,会切换到偏向锁,之后当前线程可重复进入锁住的代码块,此时第二个线程来获取锁,就会升级到轻量级级锁,然后第二个线程CAS自旋等待,自旋失败到一定次数后还没获取到锁,此时就会升级为重量级锁.

cas,比较并交换
cas算法的过程是这样的,cas包括有三个值:
v表示要更新的变量
e表示预期值,就是旧的值
n表示新值
更新时,判断只有e的值等于v变量的当前旧值时,才会将n新值赋给v,更新为新值。
否则,则认为已经有其他线程更新过了,则当前线程什么都不操作,最后cas放回当前v变量的真实值

AQS

AQS,即AbstractQueuedSynchronizer, 队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架。其定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch.

AQS核心思想是,如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中.

CLHCraig、Landin and Hagersten队列,是单向链表,AQS中的队列是CLH变体的虚拟双向队列(FIFO)AQS是通过将每条请求共享资源的线程封装成一个节点来实现锁的分配。

在这里插入图片描述

获取同步状态(加锁)
假设线程A要获取同步状态(这里想象成锁,方便理解),初始状态下state=0,所以线程A可以顺利获取锁,A获取锁后将state置为1。在A没有释放锁期间,线程B也来获取锁,此时因为state=1,表示锁被占用,所以将B的线程信息和等待状态等信息构成出一个Node节点对象,放入同步队列,headtail分别指向队列的头部和尾部(此时队列中有一个空的Node节点作为头点,head指向这个空节点,空Node的后继节点是B对应的Node节点,tail指向它),同时阻塞线程B(这里的阻塞使用的是LockSupport.park()方法)。后续如果再有线程要获取锁,都会加入队列尾部并阻塞。

释放同步状态(解锁后其他线程获取锁)

线程A释放锁时,即将state置为0,此时A唤醒头节点的后继节点(所谓唤醒,其实是调用
LockSupport.unpark(B)方法),即B线程LockSupport.park()方法返回,此时B发现state已经为0
所以B线程可以顺利获取锁,B获取锁后BNode节点随之出队。

以ReentrantLock为例

其中非公平锁的加锁流程大致如下
java.util.concurrent.locks.ReentrantLock.NonfairSync

cas判断下当前是否有锁,没有锁直接占用;

有锁时判断是否是当前线程占用(相同线程可重复入锁)
非持有锁的线程则加入到等待队列中(双向链表)
一旦进入到AQS链表中,都是按照FIFO顺序去获取锁了(这点公平锁和非公平锁都一样)
非公平锁只是在一开始获取锁的时候可以不排队互相竞争,之后进入AQS队列后线程之间还是得排队的;还有一个特殊的点是非公平锁在当前有其他线程在排队时会直接尝试获取锁,而不是像公平锁一样有其他线程在排队时会直接加入到AQS队列中去排队

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

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

相关文章

【学习笔记】SSL密码套件之密钥交换

本篇将介绍密钥交换常用的协议,分别是ECDHE,DHE,ECDH,DH,RSA,PSK 密钥交换的目的:建立种子值(Seed Value) 种子值(二进制数字)用于生成额外的对称…

Python Opencv: 基于颜色提取的印章分割

利用Python实现了一个图像处理功能,即批量提取图像中的印章区域;使用了颜色聚类的方法来提取颜色。 本代码也发布到了github,欢迎大家试用(如果帮助,请star一下): GitHub - AICVHub/seal_seg_o…

讯鹏PDA扫码机一维/二维条码扫描轻松应对各种应用场景

在数字化系统集成中,选择合适的PDA手持机至关重要。然而,市场上许多PDA手持机存在扫码不灵敏精度差、屏幕小、系统卡、可靠性弱、易损坏等问题,给用户带来诸多困扰。针对这些痛点,讯鹏推出了一款5.72寸全面屏手持扫码PDA&#xff…

Unity6 + UE5.4 PSO缓存实践记录

题图(取自COD冷战的着色器编译提示) PSO(管线状态对象 Pipeline State Object)是伴随现代图形API(DirectX12、Vulkan、Metal)而出现的概念,它本质上是单次绘制时渲染管线所处的状态信息的集合&…

滁州皖东农商银行新任董事长未得官宣,年报涉嫌泄露股东隐私

撰稿|芋圆 近期,滁州皖东农商银行发布2024年半年报,其2024年上半年营业收入4.7亿元,同比增长72%,成功实现扭亏为盈;净利润1.37亿元,同比上涨10%,增速显著提升。但其利息净收入1.4亿元&#xff…

梨花声音研修院退费普通话学习初级方法

普通话作为中国的官方语言和国家通用语言,学习和掌握普通话不仅对中国人至关重要,对世界各地的学习者也具有重要意义。无论是为了工作、学术、旅游还是文化交流,掌握普通话都能带来巨大的好处。以下是一些行之有效的普通话学习方法&#xff0…

PMP–一、二、三模–分类–14.敏捷–技巧–敏捷项目章程

文章目录 技巧一模14.敏捷--项目章程--产品意愿--是指产品负责人对产品未来前景和方向的一个高度概括描述,它应符合公司或组织的战略目标。产品愿景声明发送给项目团队中的每个人,保证团队都理解并认可产品愿景。64、 [单选] 在一次会议上,产…

PHP体检信息管理系统-计算机毕业设计源码54850

目录 1 绪论 1.1 选题背景 1.2选题意义 1.3研究的主要内容 1.4论文结构与章节安排 2系统分析 2.1.1 技术可行性分析 2.1.2经济可行性分析 2.1.3操作可行性分析 2.2 系统流程分析 2.2.1 数据新增流程 2.2.2 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2…

线性代数|机器学习-P33卷积神经网络ImageNet和卷积规则

文章目录 1. ImageNet2. 卷积计算2.1 两个多项式卷积2.2 函数卷积2.3 循环卷积 3. 周期循环矩阵和非周期循环矩阵4. 循环卷积特征值4.1 卷积计算的分解4.2 运算量4.3 二维卷积公式 5. Kronecker Product 1. ImageNet ImageNet 的论文paper链接如下:详细请直接阅读相…

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"in…

奔驰 GLS450:后排电动遮阳帘升级,畅享私密与舒适

奔驰 GLS450&#xff1a;后排电动遮阳帘升级&#xff0c;畅享私密与舒适 奔驰 GLS450&#xff0c;作为豪华 SUV 的典范&#xff0c;一直致力于为乘客提供顶级的驾乘体验。此次升级后排电动遮阳帘&#xff0c;更是将舒适与私密提升到了新的高度。 升级后的电动遮阳帘&#xff…

第12章 第9节 Web应用测试(软件评测师)

1.web应用系统负载压力测试中&#xff0c;&#xff08;并发请求数&#xff09;不是衡量业务执行效率的指标。 【解析】并发请求数是考核系统能够承受的负载&#xff0c;交易执行吞吐量、交易执行相应时间、每秒点击率是衡量业务执行效率的指标 2.用户访问某web网站&#xff0…

你可能不知道的Activity启动的诡异现象探索

你可能不知道的Activity启动的诡异现象探索 这篇文章主要记录一下遇到的android启动过程中的一个有意思的探索过程&#xff0c;可能文章会比较长&#xff0c;相信我只要读下去一定会有所收获。这里说明一下&#xff0c;这篇文章肯定会涉及到activity的启动流程&#xff0c;很多…

JAVA社交新潮流同城组局搭子不愁系统小程序源码

社交新潮流——同城组局&#xff0c;搭子不愁系统 &#x1f389;【潮流前沿&#xff0c;社交新风向】&#x1f389; 在这个快节奏的城市生活中&#xff0c;你是否常常感到周末无聊&#xff0c;想找点乐子却苦于没有合适的搭子&#xff1f;别担心&#xff0c;今天我要给大家安…

【最经典的79个】软件测试面试题(内含答案)备战“金九银十”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

RPG经典设计逻辑——DD系统简单拆解

RPG经典设计逻辑——D&D系统简单拆解 作为TGA2023年度游戏&#xff0c;身披数十项奖项及提名的《博德之门3》&#xff0c;近日又获得了2024雨果奖“最佳游戏或交互式作品”的奖项。“雨果奖”之名源于“科幻杂志之父”雨果・根斯巴克&#xff0c;是科幻及奇幻领域最负盛名…

Mysql高阶语句(2)

Mysql视图&#xff1a;优化操作与安全方案 概述&#xff1a; 视图&#xff08;View&#xff09;是数据库中的一种虚拟表&#xff0c;虽然不包含实际数据&#xff0c;但可以映射真实数据&#xff0c;像是数据库表的镜花水月或倒影。视图会动态地保存结果集的数据&#xff0c;使…

springboot邮件发送的方式?如何配置服务?

Springboot邮件发送的优化策略&#xff1f;Springboot发信技巧&#xff1f; Spring Boot作为一个流行的Java框架&#xff0c;提供了简单而强大的方式来实现邮件发送功能。AokSend将详细介绍Spring Boot邮件发送的方式&#xff0c;帮助开发者快速掌握这一技能。 SpringBoot邮件…

跟我一起学Python编程(五),变量的定义和使用

今天给大家介绍一下Python变量的定义和使用&#xff0c;我们要使用编程语言去做一件事情&#xff0c;一定要使用到变量。 什么是变量&#xff1f; 在Python中&#xff0c;变量可以用来存储各种类型的数据&#xff0c;如数字&#xff0c;文本&#xff08;称为字符串&#xff09…

云计算之大数据(上)

目录 一、Elasticsearch 1.1 产品组件 1.1.1 X-Pack 1.1.2 Beats数据采集中心 1.1.3 Logstash 1.1.4 Kibana 1.2 架构特性 1.2.1 性能 1.2.2 安全性 1.2.3 可用性 1.2.4 可扩展性 1.2.5 可维护性 1.2.6 国际化 1.3 综合检索分析 1.4 全观测 1.5 大数据检索加速…