并发锁机制

JDK1.6 synchronized (底层是由C++实现的):


synchronized: 互斥锁,悲观 锁,同步锁,重量级锁(耗性能),多线程使用重量级锁很容易发生线程阻塞,因为涉及到多个线程的启动和运行;

在线程执行具体某个方法时,其他会通过synchronized实现机制丢到任务队列,等执行线程释放锁,其他线程根据抢占获得锁,在抢占的过程中,根据上下文的切换操作系统的的调度,就会发生线程的阻塞

说明一点:JDK1.6就开始对synchronized 做了大量的优化。


通过实践对比(原子类和synchronized的性能)


原子类比synchronized锁 n++ 自增的效率更快。

原子类的底层实现是不断通过while循环进行cas,直到value设置成功,在while的这一步可能会发生死循环。


CAS(compareAndset,compareAndSwapInt),自选会成为CAS的瓶颈


cas:无锁,自旋锁,乐观锁,轻量级锁,乐观锁一般情况下,是不易发生线程阻塞的,轻量级则性能更好。


原子性问题


一般使用JDK类库的包如果自带原子性,则无线程安全问题,否则就会有原子性问题。

原子性问题:

1,compare和set之间如果不是一个原子操作,就会出现多线程并发问题

(compareAndSwapInt是C语言实现的:通过JNIENV调用C++的代码,不同的JNIENV调用的C++的代码都是彼此独立的,针对不同的CPU和硬件设备,底层对应的实现机制是不一样的,C++那块的代码也是Atomic事务修饰)

特别说明:JVM跨平台就是通过Java语言帮我们做了一层屏蔽(例如native修饰的),直接调到了C++的代码,另外根据机器的不同,JVM是由不同的实现方式的。

大致流程如下

Java应用层业务代码 --> Cas --> JNI进行不同的实现机制调用到不同的C++代码 -->

汇编语言 --> asm类:会获取系统参数,判断mp属性是不是一个多核参数,如果是就返回一个Lock指令 --> 汇编指令[这里会进行操作系统级别的使用Lock指令加一把锁,让使用的类保持一个原子特性]

从流程可以看到我们的终端是通过汇编指令上Lock锁来保证变量的原子性


ABA问题 (不知道是那个线程该的数据,并将数据还原的,所以修改的内存值需要加个版本号来区分)


场景:假设线程A读到当前值是10,可能线程B把值修改为100,然后线程C又把值修改为10。

在更改值之间,原始值被其他线程修改,导致比较不能成功,从而无法进行set。

因为这种问题可以说是存在合理的,线程拿到数据,在去比较并更改,导致值发生了变更,无法set(根据业务需求看是否需要解决)

解决方式: 设置初始值时,增加一个version版本号,初始值设置为 1 ,根据版本号来分区。

AtomicStampedReferencede的底层实现,就用了这套version的实现方式

,Java也提供了AtomicStampedReference类供我们用,说白了就是加了个版本,比对的就是内存值+版本是否一致


其他方面


1,JVM默认是不开启偏向锁的,可以通过启动参数开启偏向锁

2,Thread.Sleep(不会释放锁,会持有锁,所以容易造成其他线程竞争)

3,如果有两个或两个以上的线程操作同一个变量,并且用synchronized来保证变量的线程安全问题,可以考虑使用JDK并发包的原子类 AtomicStampedReferencede和LongAdder来提升性能,因为前者由于竞争关系,会导致线程持有锁的状态升级成重量级锁,后者是轻量级锁

4,顺便提一句 LongAdder的性能 通过实践得出比 AtomicStampedReferencede的性能好

LongAdder的实现流程(CAS的瓶颈就是自旋,LongAdder的思想就是把要操作的目标资源「分散」到数组Cell中,每个线程对自己的 Cell 变量的 value 进行原子操作,大大降低了失败的次数):

分段cas --> 分段cas++ --> 创建一个变量的副本数组 --> 其他线程对副本数组中的具体变量进行分段cas操作(造成少量的线程访问,不会触发多线程等待发生自选) --> 副本的数进行sum()在 加 1

AtomicStampedReferencede的实现流程:

CAS --> JNI --> C++ --> 汇编指令 --> 乐观锁

5,LongAdder和AtomicStampedReferencede相比,在实现流程上LongAdder多了一个分段cas借此来提高了性能


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

elementUI的el-table自定义表头

<el-table-column label"昨日仪表里程(KM)" align"left" min-width"190" :render-header"(h, obj) > renderHeader(h, obj, 参数)" > <template slot-scope"scope"> <span>{{ scope.row.firstStartMil…

最新Springboot小程序医院核酸检测服务系统

采用技术 最新Springboot小程序医院核酸检测服务系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员页面 医护人员管理 普通管理员管理 接种进…

opencascade AIS_InteractiveContext源码学习4 object local transformation management

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

ASP .Net Core创建一个httppost请求并添加证书

ASP .Net Core创建一个httppost请求并添加证书 创建.net Core程序&#xff0c;使用自签名证书&#xff0c;可以处理https的get和post请求。 创建证书 创建自签名证书的流程可以在这里查看&#xff1a; https://blog.csdn.net/GoodCooking/article/details/139815278创建完毕…

STM32通过Flymcu串口下载程序

文章目录 1. Flymcu 2. 操作流程 2.1 设备准备 2.2 硬件连接 2.3 设置BOOT引脚 2.4 配置 2.5 下载程序 1. Flymcu Flymcu软件可以通过串口给STM32下载程序&#xff0c;如果没有STLINK的时候&#xff0c;就可以使用这个来烧录程序。软件不用安装&#xff0c;直接打开就行…

pytorch十大核心操作

PyTorch的十大核心操作涵盖了张量创建、数据转换、操作变换等多个方面。以下是结合参考文章信息整理出的PyTorch十大核心操作的概述&#xff1a; 张量创建&#xff1a; 从Python列表或NumPy数组创建张量。使用特定值创建张量&#xff0c;如全零、全一、指定范围、均匀分布、正…

qt开发-07_radioButton

QRadioButton 部件提供了一个带有文本标签的单选框&#xff08;单选按钮&#xff09;。 QRadioButton 是一个可以切换选中&#xff08;checked&#xff09;或未选中&#xff08;unchecked&#xff09;状态的选项按钮。 单选框通常呈现给用户一个“多选一”的选择。也就是说&…

在Ubuntu系统中部署Java及Spring Boot开发环境

选择Java及Spring Boot构建Web服务具有显著优势&#xff0c;Java的跨平台兼容性保证了服务可在不同操作系统上顺畅运行&#xff0c;而Spring Boot的成熟框架则大大简化了开发流程&#xff0c;减少了繁琐配置。此外&#xff0c;强大的社区支持、易于维护与扩展的特性、优异的性能…

机器学习——RNN、LSTM

RNN 特点&#xff1a;输入层是层层相关联的&#xff0c;输入包括上一个隐藏层的输出h1和外界输入x2&#xff0c;然后融合一个张量&#xff0c;通过全连接得到h2&#xff0c;重复 优点&#xff1a;结构简单&#xff0c;参数总量少&#xff0c;在短序列任务上性能好 缺点&#x…

浅谈医工交叉方向SCI写作

笔者因为工作性质原因&#xff0c;这几年写了不少医学人工智能方向的SCI论文&#xff0c;顺带每年相关的论文的阅读量也有小几百篇&#xff0c;特别是在医学影像AI方向&#xff0c;也算是小有心得&#xff0c;今天就简单聊一下医工交叉(影像AI)方向的SCI论文写作与投稿问题。 首…

计算机网络:应用层 - 域名系统 DNS

计算机网络&#xff1a;应用层 - 域名系统 DNS 域名结构域名服务器域名解析迭代查询递归查询 互联网中的每台设备都有一个唯一的IP地址&#xff0c;但这些地址通常是复杂的数字组合&#xff0c;例如 172.217.160.142&#xff0c;难以记忆和识别。域名系统将这些复杂的IP地址与易…

kafka基础概念

目录 1、kafka简介 2、kafka使用场景 3、kafka基础概念 3.1、消息 3.1.1、消息构成详解 3.1.2、消息存储设计 3.2、topic 3.3、partition 3.4、offset 3.5、replication 3.5.1、replication简介 3.5.2、副本角色 3.5.3、副本类型 3.5.3.1、副本类型简介 3.5.3.2、…

低代码平台实践:打造高效动态表单解决方案的探索与思考

&#x1f525;需求背景 我司业务同事在抓取到候选人的简历之后&#xff0c;经常会出现&#xff0c;很多意向候选人简历信息不完整&#xff0c;一个个打电话确认的情况&#xff0c;严重影响了HR的工作效率&#xff0c;于是提出我们可以通过发送邮件、短信、H5链接的方式来提醒候…

【Linux】使用ntpdate同步

ntpdate 是一个在 Linux 系统中用于同步系统时间的命令行工具&#xff0c;它通过与 NTP 服务器通信来调整本地系统时钟。然而&#xff0c;需要注意的是&#xff0c;ntpdate 已经被许多现代 Linux 发行版弃用。 安装 yum install -y ntpdate 查看时间 date同步时间 ntpdate ntp…

端口已被占用 1080

http://www.nirsoft.net/utils/cports.html#DownloadLinks 下载后解压&#xff0c;直接运行cports.exe. 这里写图片描述 找到被占用的端口&#xff0c;右键选择 “Close Selected TCP Connections”

python使用pyautogui自动化模拟鼠标、键盘操作、截屏、识别图片位置

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

Spring Boot集成tensorflow实现图片检测服务

1.什么是tensorflow&#xff1f; TensorFlow名字的由来就是张量(Tensor)在计算图(Computational Graph)里的流动(Flow)&#xff0c;如图。它的基础就是前面介绍的基于计算图的自动微分&#xff0c;除了自动帮你求梯度之外&#xff0c;它也提供了各种常见的操作(op&#xff0c;…

Redis通用命令详解

文章目录 一、Redis概述1.1 KEYS&#xff1a;查看符合模板的所有 key1.2 DEL&#xff1a;删除一个指定的 key1.3 EXISTS&#xff1a;判断 key 是否存在1.4 EXPIRE&#xff1a;给一个 key 设置有效期&#xff0c;有效期到期时该 key 会被自动删除1.5 TTL&#xff1a;查看一个 ke…

《梦醒蝶飞:释放Excel函数与公式的力量》4.1if函数

第4章&#xff1a;逻辑与条件函数 第一节4.1 if函数 在Excel中&#xff0c;逻辑函数用于处理基于特定条件的真假判断&#xff0c;它们是构建复杂公式和进行高级数据分析的基础。本章将深入探讨逻辑函数的使用方法&#xff0c;特别是IF函数&#xff0c;这是Excel中最为常用的条…

Spring Boot程序打包docker镜像

1.将springboot程序使用maven package打包出jar。 2.创建dockerfile。 FROM openjdk:8 VOLUME /tmp EXPOSE 8601 #ADD 后面的参数是项目名字 / 后面的参数是自定义的别名 ADD webflux-hello-0.0.1-SNAPSHOT.jar /webflux-hello.jar #这里的最后一个变量需要和前面起的别名相同…