并发(6)

news2024/10/5 16:01:00

目录

36.什么是CAS?

37.CAS使用示例,结合AtomicInteger给出示例?

38.CAS会有哪些问题?

39.AtomicInteger底层实现?

40.请阐述你对Unsafe类的理解?


36.什么是CAS?

CAS的全称为Compare-And-Swap,直译就是对比交换。是一条CPU的原子指令,其作用是让CPU先进性比较两个值相等,然后原子地更新某个位置的值,经过调查发现,其实现方式是基于硬件平台的汇编指令,就是说CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口。

简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下载旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。

CAS操作是原子性的,所以多线程并发使用CAS更新数据时,可以不使用锁。JDK中大量使用了CAS来更新数据而防止加锁(synchronized重量级锁)来保持原子更新。

CAS操作是原子性的,所以多线程并发使用CAS更新数据时,可以不使用锁。JDK中大量使用了CAS来更新数据而防止加锁(synchronized 重量级锁)来保持原子更新。

相信SQL大家都熟悉,类似SQL中条件更新一样:update  set id=3 from table where id = 2。因为单条SQL执行原子性,如果有多个线程同时执行此SQL语句,只有一条能更新成功。

37.CAS使用示例,结合AtomicInteger给出示例?

如果不使用CAS,在高并发下,多线程同时修改一个变量的值我们需要synchronized加锁(可能有人说可以用Lock加锁,Lock底层的AQS也是基于CAS进行获取锁的)。

Java中我们提供了AtomicInteger原子类(底层基于CAS进行更新数据的),不需要加锁就在多线程并发场景下实现数据一致性。

38.CAS会有哪些问题?

CAS方式为乐观锁,synchronized为悲观锁。因此使用CAS解决并发问题通常情况下性能更优。

但使用CAS方式也会有几个问题:

ABA问题

因为CAS需要再操作值的时候,检查值有没有发生变化,比如没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时则会发现他的值没有发生变化,但是实际上却变化了。

ABA问题的解决思路就是使用版本号。在变量前两追加上版本号,每次变量更新的时候把版本号加1,那么A->B->A就会变成1A->2B->3A。

从jdk1.5开始,JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法的作用是首先检查当前引用是否等于预期引用,并且检查的作用是首先检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

循环时间长开销大

自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升。pause指令有两个作用:第一,他可以延迟流水线执行命令,使CPU不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零;第二,他可以避免在推出循环的时候因内存顺序冲突而引起CPU流水线被清空,从而提高CPU的执行效率。

只能保证一个共享变量的原子操作

当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁。

还有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。比如,有两个变量i=2,j=a,合并一下ij=2a,然后用CAS来操作ij。

从Java1.5开始,JDK提供了AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对象里来进行CAS操作。

39.AtomicInteger底层实现?

CAS+volatile

volatile保证线程的可见性,多线程并发时,一个线程修改数据,可以保证其他线程立马看到修改后的值CAS保证数据更新的原子性。

40.请阐述你对Unsafe类的理解?

如上图所示,Unsafe提供的API大致可分为内存操作,CAS,Classpath相关,对象操作,线程调度,系统信息获取,内存屏障,数组操作等几类,下面将对其相关方法和应用场景进行详细介绍。

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

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

相关文章

QT DAY1作业

1.QQ登录界面 头文件代码 #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include <QIcon> #include <QLabel> #include <QPushButton> #include <QMovie> #include <QLineEdit>class MyWidget : public QWidget {Q_OBJECTpu…

LLM之LangChain(一)| LangChain六大核心模块简要汇总

声明&#xff1a;本文主要内容来自以下书籍《LangChain入门指南&#xff1a;构建高可复用、可扩展的LLM应用程序》和LangChain官网&#xff0c;非常感谢作者的贡献&#xff0c;由于作者有版权限制&#xff0c;因此在这里声明&#xff0c;如果涉及侵权&#xff0c;请联系我删除此…

java 创建一个可执行的jar包小程序

第1步&#xff1a;写好代码 public class Main {public static void main(String[] args) {String str "hahah";if (StringUtils.isBlank(str)) {System.out.println(str);}System.out.println("Hello world!");} }第2步&#xff1a;设置 Artifact 选择入…

HTTPS网站被攻击的原理,网站被攻击应该如何进行防护吗,新手必知

网站是通过独特的一个端口来进行加密传输&#xff0c;防止传输中的内容被窃取&#xff0c;一般用HTTPS协议做网站的&#xff0c;一般是大型网站&#xff0c;以及支付网站&#xff0c;用户数据比较重要的一些网站&#xff0c;证书要单独购买&#xff0c;HTTPS超文本传输安全协议…

无人地磅系统|内蒙古中兴首创无人地磅和远程高效管理的突破

走进标杆企业&#xff0c;感受名企力量&#xff0c;探寻学习优秀企业领先之道。 本期要跟砼行们推介的标杆企业是内蒙古赤峰市砼行业的龙头企业&#xff1a;赤峰中兴首创混凝土搅拌有限责任公司&#xff08;以下简称为中兴首创&#xff09;。 中兴首创成立于2011年初&#xff…

OpenFeign学习思维导图

参考&#xff1a; 1、OpenFeign如何为FeignClient生成动态代理类 2、Feign底层原理分析-自动装载&动态代理 3、FactoryBean和普通Bean的区别

gephi——graphviz插件设置

gephi_graphviz插件设置 以下是我总结出来的一点经验 1. 安装graphviz软件&#xff0c;请见作者其他博客 2. 安装gephi 插件&#xff0c;并激活 3. 运行graphviz布局&#xff0c;会遇到找不到dot问题 问题描述&#xff1a;Graphviz process error X There was an error launc…

Wi-Fi 6 超值畅享|乐鑫发布 ESP32-C61 SoC

乐鑫信息科技 (688018.SH) 宣布推出全新的 Wi-Fi 6 Bluetooth 5 (LE) SoC ESP32-C61。这款芯片作为 ESP32-C 系列的新成员&#xff0c;旨在满足对 Wi-Fi 6 技术不断增长的市场需求。ESP32-C61 在继承 ESP32-C2 和 ESP32-C3 成功经验的基础上&#xff0c;显著优化了外设、强化了…

使用flet创建todo应用

使用 Flet 在 Python 中创建待办事项应用 Create To-Do app in Python with Flet 翻译官网教程https://flet.dev/docs/tutorials/python-todo&#xff0c;对一些地方进行了注释和修改。 安装flet Python版本需要3.8及以上&#xff0c;使用pip安装&#xff1a; pip install…

怎么批量在文件名前面加编号?

怎么批量在文件名前面加编号&#xff1f;我们时常需要给文件的名称进行编号&#xff0c;通过给文件名进行编号&#xff0c;可以使文件按照编号的顺序进行排序&#xff0c;方便进行查找和整理。特别是在处理大量文件时&#xff0c;编号可以提供一种有序的方式来组织文件&#xf…

【redis】Redis中的字典类型:数据结构与使用方法

文章目录 Redis中的字典类型&#xff1a;数据结构与使用方法简介如何提高哈希表性能如何使用 Redis中的字典类型&#xff1a;数据结构与使用方法 简介 Redis中的字典类型的底层实现是哈希表&#xff08;Hash Table&#xff09;。 Redis的字典使用哈希表作为底层实现&#xf…

软件测试|MySQL主键约束详解:保障数据完整性与性能优化

简介 主键&#xff08;PRIMARY KEY&#xff09;的完整称呼是“主键约束”&#xff0c;是 MySQL 中使用最为频繁的约束。一般情况下&#xff0c;为了便于 DBMS 更快的查找到表中的记录&#xff0c;都会在表中设置一个主键。 MySQL是一种广泛使用的开源关系型数据库管理系统&am…

海豚²来了丨DolphinDB 集成 DolphinScheduler,任务调度更轻松

DolphinDB 是一款高性能时序数据库。DolphinDB 集成了功能强大的编程语言和高容量高速度的批流一体数据分析系统&#xff0c;为海量数据&#xff08;特别是时间序列数据&#xff09;的快速存储、检索、计算及分析提供一站式解决方案。在实际生产环境中&#xff0c;经常存在数据…

LeetCode刷题12:贪心算法解决1402.做菜顺序

一个厨师收集了他 n 道菜的满意程度 satisfaction &#xff0c;这个厨师做出每道菜的时间都是 1 单位时间。 一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间&#xff08;包含之前每道菜所花费的时间&#xff09;乘以这道菜的满意程度&#xff0c;也就是 time[i]*sa…

决策树--CART回归树算法详解

1、介绍 &#xff08;1&#xff09;简介 CART&#xff08;Classification and Regression Trees&#xff09;回归树是一种基于决策树的机器学习算法&#xff0c;用于预 测连续型目标变量而不是离散型类别变量。 &#xff08;2&#xff09;生成过程 ① 选择一个特征和相应的…

安达发APS|PDM产品数据管理可以帮助企业实现的价值

在实际运用中&#xff0c;APS系统的PDM产品数据管理功能可以帮助企业实现以下价值&#xff1a; 1. 提高产品设计和制造的效率&#xff1a;通过对产品结构和文档的统一管理&#xff0c;可以实现对产品信息的快速查询和检索&#xff0c;提高产品设计和制造的效率。 2. 保证产品数…

软件测试|测试平台开发-Flask入门:Flask动态路由

前言 之前我们介绍了flask发送http请求&#xff0c;以及flaskURL的详解&#xff0c;我们使用的路由都是固定的&#xff0c;一个路径和一个视图函数绑定&#xff0c;当访问这条路径时会触发相应的处理函数。但是当我们要处理更为复杂的情况时&#xff0c;比如我们有多个用户&am…

PyTorch|保存与加载自己的模型

训练好一个模型之后&#xff0c;我们往往要对其进行保存&#xff0c;除非下次用时想再次训练一遍。 下面以一个简单的回归任务来详细讲解模型的保存和加载。 来看这样一组数据&#xff1a; xtorch.linspace(-1,1,50)xx.view(50,1)yx.pow(2)0.3*torch.rand(50).view(50,1) 画…

SpringBoot + Mybatis 实现多数据源原来如此简单

1、为什么需要整合多数据源 在开发的过程中&#xff0c;我们可能会遇到一个工程使用多个数据源的情况&#xff0c;总体而言分为以下几个原因 a、数据隔离&#xff1a;将不同的数据存储在不同的数据库中&#xff0c;如多租户场景 b、性能优化&#xff1a;将数据分散到多个数据库…

【项目实战】Cadence工具的使用2

代码覆盖率的收集 双击total&#xff0c;打开imc工具。total 下的文件是代码覆盖率文件 找到DUT模块&#xff01;从图中可以看到代码的覆盖率已经是94.43% 添加exclude文件&#xff0c;注意和Synopsys的后缀不同。 导入.vRefine文件 代码覆盖率为100%。 原因是我们添加了exclu…