[JAVAEE] 面试题(二) - CAS 和 原子类

目录

一. CAS的实现原理

1.1 伪代码分析

1.2 底层实现 

二. CAS 操作示例

三. ABA问题

四. 原子类

4.1 使用原子类的目的

4.2 原子类的使用示例

五. 总结


一. CAS的实现原理

CAS(compare and swap 比较和交换)是一种用于实现无锁并发的技术.

1.1 伪代码分析

    // 伪代码boolean CAS(address, expectValue, swapValue) {if (&address == expectValue) {&address = swapValue;return true;}return false;}

&address: 需要修改的值.

expectValue: 预期的值.

swapValue: 新值, 需要赋值给&address的值.

核心思想: 比较当前需要修改的值和预期的值是否相同, 如果相同, 就用新值替换需要修改的值.

1.2 底层实现 

CAS无锁并发技术底层是靠C语言依赖的操作系统的原子操作来实现原子性的. 即在这个过程中不会被其他线程打断(CAS可以理解为是一个赋值操作, 这是原子性的, 不会产生线程安全问题).


二. CAS 操作示例

假设有一个整数变量count, 初始值为0, 现在有A, B两个线程同时对count进行+1操作.(使用CAS无锁并发技术)

1. 线程A读取变量count的值, 得到0.

2. 线程B读取变量count的值, 得到0.

3. 线程A将变量count的值与预期的值0进行比较, 相等, 将count的值增加为1.

4. 线程B将变量count的值与预期的值0进行比较, 不相等(count的值已经被线程A增加为1), 则重试.

5. 线程B重新读取变量count的值, 得到1.

6. 线程B将变量count的值与预期的值1进行比较, 相等, 将count的值增加为2.

最终, count的值为2.


三. ABA问题

假设有两个线程, 线程1使用CAS技术将val的值从A修改成B, 又把val的值从B修改成A. 线程2通过CAS技术判断线程1没有对val的值进行修改, 于是线程2再次修改val的值(实际上不需要修改). 这就是 ABA 问题.

解决:

在CAS操作的时候对val加版本号.

A 1.0

B 2.0

A 3.0

java中的 AtomicStampedReference类 解决了ABA问题.

四. 原子类

java中的原子类在 java.util.concurrent.atomic 包中.

4.1 使用原子类的目的

为了不加锁, 提高程序运行效率.

4.2 原子类的使用示例

实现一个无锁的计数器.

    static AtomicInteger count = new AtomicInteger();public static void main(String[] args) throws InterruptedException{Thread t1 = new Thread(() -> {for (int i = 0; i < 50000; i++) {count.getAndIncrement();}});Thread t2 = new Thread(() -> {for (int i = 0; i < 50000; i++) {count.getAndIncrement();}});t1.start();t2.start();t1.join();t2.join();System.out.println(count.get());}


五. 总结

1. CAS(compare and swap) 是一种无锁并发技术.

2. CAS的伪代码分析: 将需要修改的值和预期的值进行比较, 如果相等, 就用新值替换需要修改的值.

3. CAS的底层实现: CAS底层是靠C语言依赖的操作系统的原子操作来实现的原子性,(本质上是赋值操作, 是原子性的, 是线程安全的.)

4. ABA问题, 解决(对CAS操作需要修改的值加版本号).

5. 使用原子类的目的.(为了避免加锁操作, 提高程序运行效率).

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程

Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程 Ubuntu 20.04 安装 OpenCV 和 OpenCV_contrib 教程前言 OpenCV概述核心功能优势特点应用领域安装与使用 OpenCV_contrib概述核心功能具体模块 安装与使用一、准备工作二、下载OpenCV和OpenCV_contrib三、编译和安装OpenCV四、…

HCIP--2 TCP有关笔记

学习目标&#xff1a; 目录 学习目标&#xff1a; 学习内容&#xff1a; TCP协议 七层结构 END.......... 问题&#xff1a;TCP/IP 的四层协议 问题&#xff1a;网络的七层结构及其作用 问题&#xff1a;协议名称是什么&#xff1f; TELNET---远程登陆系统 HTTP---超文本传输协…

【优先算法】双指针

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;优先算法 个人主页&#xff1a;Celias blog~ 目录 ​​​​​​移动零 复写零 快乐数 盛水最多的容器 …

Apache配置案例二:基于域名的虚拟主机搭建

文章目录 前言一、任务要求&#xff1a;二、任务分析&#xff1a;二、任务步骤&#xff1a;总结 前言 基于域名的虚拟主机搭建&#xff0c;涉及诸多知识点&#xff0c;一是域名服务器的搭建配置&#xff0c;前面的博文《图示详解OpenEuler下 DNS安装、配置与测试》、《图示详解…

如何选择适合自己的 Python IDE

集成开发环境&#xff08;IDE&#xff09;是指提供广泛软件开发能力的软件应用程序。IDE 通常包括源代码编辑器、构建自动化工具和调试器。大多数现代 IDE 都配备了智能代码补全功能。在本文中&#xff0c;你将发现目前市场上最好的 Python IDE。 什么是 IDE&#xff1f; IDE…

开源项目-投票管理系统

哈喽&#xff0c;大家好&#xff0c;今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页&#xff0c;发起投票&#xff0c;管理投票&#xff0c;参与投票&#xff0c;查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户…

OpenSSL

OpenSSL 概述 OpenSSL 是一个开源的、安全传输协议实现工具&#xff0c;广泛应用于数据加密与解密、证书生成与管理以及其他安全性相关的任务。在现代网络安全中&#xff0c;OpenSSL 被用于构建和维护 SSL/TLS 通信&#xff0c;确保数据在传输过程中的机密性和完整性。 简单来…

ApsaraMQ Serverless 能力再升级,事件驱动架构赋能 AI 应用

本文整理于 2024 年云栖大会阿里云智能集团高级技术专家金吉祥&#xff08;牟羽&#xff09;带来的主题演讲《ApsaraMQ Serverless 能力再升级&#xff0c;事件驱动架构赋能 AI 应用》 云消息队列 ApsaraMQ 全系列产品 Serverless 化&#xff0c;支持按量付费、自适应弹性、跨可…

fmql之Linux以太网

正点原子第57章。 dts fmql-dtsi&#xff1a; 我们用的PHY芯片是RTL8211F&#xff1a; 需要添加PHY信息&#xff1a; fmql-dtsi提供的参考&#xff1a; 根据vivado工程自动生成的&#xff1a; reg <0x1>; 配置 疑问 网口通讯需要网线&#xff0c;但是目前板卡上只有PS…

Java面试经典 150 题.P26. 删除有序数组中的重复项(003)

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int removeDuplicates(int[] nums) …

在 Elasticsearch 中顺利管理季节性时间变化

作者&#xff1a;来自 Elastic Valeriy Khakhutskyy, James Gowdy 用于 Elasticsearch 异常检测的新夏令时日历。 每年春季和秋季两次&#xff0c;许多国家/地区都会调整时钟以更好地利用日光。这些时钟调整不仅会带来时差和 “困倦的星期一” 的感觉&#xff0c;还会带来来自…

Qt——信号和槽

一.信号和槽概述 谈及信号&#xff0c;很容易联想到在Linux系统中所分享到的信号。那么Linux信号和Qt信息有什么不同&#xff1f; 在 Qt 中&#xff0c;用户和控件的每次交互过程称为⼀个事件。比如 "用户点击按钮" 是⼀个事件&#xff0c;"用户关 闭窗口&quo…

必胜客万圣节“邪恶鬼手披萨”,品牌营销的“鬼”才之作!

在万圣节的神秘氛围下&#xff0c;各大品牌纷纷推出创意营销活动&#xff0c;试图在这个充满奇幻色彩的节日里捕获消费者的心。其中&#xff0c;必胜客推出的“邪恶鬼手披萨”无疑是一次令人拍案叫绝的品牌营销“鬼”才之作&#xff0c;它不仅巧妙地融合了节日元素&#xff0c;…

3D Gaussian Splatting代码详解(一):模型训练、数据加载

1 模型训练 def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):first_iter 0# 初始化高斯模型&#xff0c;用于表示场景中的每个点的3D高斯分布gaussians GaussianModel(dataset.sh_degree)# 初始化…

[MySQL#6] 表的CRUD (1) | Create | Retrieve(查) | where

目录 1. 插入 1.1 单行数据 - 全列插入 指定列插入 1.2 多行数据 - 全列插入 指定列插入 1.3 更新 1.4 替换 2. 查找 2.1 select 列 2.2 where 条件 具体案例 2.3 结果排序 总结关键字执行顺序 2.4 筛选分页结果 CRUD : Create(创建)&#xff0c;Retrieve(读取)&…

[机器学习]集成学习

1 集成学习 强强联合、弱弱变强Bagging&#xff08;平权投票&#xff09;&#xff1a;随机森林Boosting&#xff08;加权投票&#xff09;&#xff1a;Adaboost、GBDT、XGBoost、LightGBM 2 随机森林 3 Adaboost 放大错误数据&#xff0c;缩小正确数据

第三十三篇:TCP协议如何避免/减少网络拥塞,TCP系列八

一、流量控制 一般来说&#xff0c;我们总是希望数据传输得更快一些&#xff0c;但是如果发送方把数据发送得太快&#xff0c;接收方可能来不及接收&#xff0c;造成数据的丢失&#xff0c;数据重发&#xff0c;造成网络资源的浪费甚至网络拥塞。所谓的流量控制&#xff08;fl…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

数据结构---链表(一)【不带头单向非循环】

文章目录 链表概念链表的使用LinkedList 的几种遍历方式单链表的模拟实现&#xff08;不带头&#xff09;链表面试题 观察ArrayList 顺序表的源码发现&#xff0c;底层是使用数组实现的。由于其底层是一段连续空间&#xff0c;当在ArrayList任意位置插入或者删除元素时&#xf…

Pytorch(一)

一.PyTorch环境配置及安装 1.1 工具安装 1.1.1 Anaconda下载 清华大学镜像站下载&#xff0c;版本为Anaconda3-5.2.0-Windows-x86_64&#xff08;对应python3.6.5&#xff09; Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 1.1.2…