大厂面试真题-CAS的弊端和规避措施

news/2024/10/9 7:18:57 标签: 面试, 职场和发展, java, 开发语言, jvm
CAS 操作的弊端和规避措施

1. CAS 操作的弊端

CAS 操作的弊端主要有以下 4 点。

1ABA问题

使用 CAS 操作内存数据时,当数据发生过变化也能更新成功,如操作序列 A==>B==>A 时,最
后一个 CAS 的预期数据 A 实际已经发生过更改,但也能更新成功,这就产生了 ABA 问题。
ABA 问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候将版
本号加 1 ,那么操作序列 A==>B==>A 的就会变成 A1==>B2==>A3 ,如果将 A1 当作 A3 的预期数据,
就会操作失败。
JDK 提供了两个类 AtomicStampedReference AtomicMarkableReference 来解决 ABA 问题。比较
常用的是 AtomicStampedReference 类,该类的 compareAndSet 方法的作用是首先检查当前引用是否等
于预期引用,以及当前印戳是否等于预期印戳,如果全部相等,就以原子方式将引用和印戳的值一
同设置为新的值。

2)只能保证一个共享变量之间的原子性操作

当对一个共享变量执行操作时,我们可以使用循环 CAS 的方式来保证原子操作,但是对多个
共享变量操作时, CAS 无法保证操作的原子性。
一个比较简单的规避方法为:把多个共享变量合并成一个共享变量来操作。
JDK 提供了 AtomicReference 类来保证引用对象之间的原子性,可以把多个变量放在一个
AtomicReference 实例后再进行 CAS 操作。比如有两个共享变量 i 1 j=2 ,可以将二者合并成一个
对象,然后用 CAS 来操作该合并对象的 AtomicReference 引用。

3)无效CAS会带来开销问题

自旋 CAS 如果长时间不成功(不成功就一直循环执行,直到成功为止),就会给 CPU 带来非
常大的执行开销。

4)在部分CPU平台上存在“总线风暴”问题

CAS 操作和 volatile 一样也需要 CPU 进行通过 MESI 协议各个内核的“ Cache 一致性”,会通过
CPU BUS (总线)发送大量 MESI 协议相关的消息,产生“ Cache 一致性流量”。因为总线被设计
为固定的“通信能力”,如果 Cache 一致性流量过大,总线将成为瓶颈,这就是所谓的“总线风暴”。

2. 提升 CAS 性能

提升 CAS 性能有效方式之一是以空间换时间,分散竞争热点。较为常见的方案为:
1 )分散操作热点,使用 LongAdder 替代基础原子类 AtomicLong LongAdder 将单个 CAS 热点
value 值)分散到一个 cells 数组中。
2 )使用队列削峰,将发生 CAS 争用的线程加入一个队列中排队,降低 CAS 争用的激烈程度。
JUC 中非常重要的基础类 AQS (抽象队列同步器)就是这么做的。
提升 CAS 性能有效方式之二是使用线程本地变量,从根本上避免竞争。
声明:本文来源于网络

http://www.niftyadmin.cn/n/5695460.html

相关文章

【数据结构】介绍

介绍数据结构 数据结构是计算机科学中重要的概念,是指组织和管理数据的方式。它涉及到数据的存储、操作和访问等操作。数据结构可以分为线性结构、树形结构和图形结构等。 线性结构是最简单的数据结构之一(本玄也是这样觉得(* ̄▽ ̄*))&#…

《系统架构设计师教程(第2版)》第17章-通信系统架构设计理论与实践-07-通信网络构建案例分析

文章目录 1. 高可用网络构建分析1.1 网络接入层高可用性设计1.1.1 高可用接入层特征1.1.2 接入汇聚层的方式1)倒U 形接法(组网模型一)2)U 形接法(组网模型二)3)矩形接法(组网模型三)4)三角形接法(组网模型四) 1.2 网络…

构建高效水果购物平台:SpringBoot飘香网站案例

1系统概述 1.1 研究背景 如今互联网高速发展,网络遍布全球,通过互联网发布的消息能快而方便的传播到世界每个角落,并且互联网上能传播的信息也很广,比如文字、图片、声音、视频等。从而,这种种好处使得互联网成了信息传…

C#/.NET/.NET Core技术前沿周刊 | 第 8 期(2024年10.01-10.06)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿&…

CSS 图标和文本对齐

比如下面一段HTML代码&#xff0c;我们想在图标旁边显示文本或者数字 <body> <div><img src"smile.svg" alt"smile"><span>12</span></div> <div><img src"heartShape.svg" alt"…

.net core API中使用LiteDB

LiteDB介绍 LiteDB 是一个小巧、快速和轻量级的 .NET NoSQL 嵌入式数据库。 无服务器的 NoSQL 文档存储简单的 API&#xff0c;类似于 MongoDB100% 的 C# 代码支持 .NET 4.5 / NETStandard 1.3/2.0&#xff0c;以单个 DLL&#xff08;不到 450KB&#xff09;形式提供线程安全…

数据结构与算法篇(刷题篇 - 树)

目录 1. 二叉树的前序遍历&#xff08;简单&#xff09; 1.1. 题目描述 1.2. 解题思路 方法一&#xff1a;递归&#xff08;推荐使用&#xff09; 方法二&#xff1a;非递归&#xff08;扩展思路&#xff09; 2. 二叉树的中序遍历&#xff08;中等&#xff09; 2.1. 题目…

Apache Flink 和 Apache Kafka

Apache Flink 和 Apache Kafka 都是大数据生态系统中非常重要的工具&#xff0c;但它们的作用和应用场景有所不同。下面将分别介绍两者的主要特性和它们之间的异同点。 Apache Kafka 作用&#xff1a; 消息队列&#xff1a;Kafka 主要作为消息队列使用&#xff0c;用于解耦生…