原子操作的原理和实现

news2025/1/21 22:10:30

目录

相关术语

处理器如何实现原子操作

Java如何实现原子操作

循环CAS实现原子操作

使用锁机制实现原子操作


原子操作是指一个或者多个不可再分割的操作。这些操作的执行顺序不能被打乱。

相关术语

缓存行:缓存的最小操作单位

(面试题、重点)比较并且交换(CAS):CAS操作(CAS无锁状态下安全更新数据)需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。我们一个线程往回更新的时候会锁总线,其他线程即使切换到也不能传回数据,所有可以在多线程下保证数据的正确性(这个表明我们不能自己写一个cas,需要调用Java核心的Java方法来使用操作系统的cas)

cas有个问题,对中间的感知不清楚(ABA问题)

CPU流水线:每个人只做一件事,没有切换时间,提高总体效率(假如共10个任务,每个任务5个基本指令,共50个基本指令。流水线就会先将所有任务中的相同的基本指令一起执行完之后,再更换线路来执行其他相同的指令,这样减少了线路的切换,而线路切换需要的时间很长)(流水线可能导致顺序错乱问题,在同一个线程中,代码的底层执行顺序可能是乱的,可能执行顺序是先第二行再第一行)

内存顺序冲突:内存顺序冲突一般是由假共享引起的,假共享是指多个CPU同时修改同一个缓存行的不同部分而引起其中一个CPU的操作无效,当出现这个内存顺序冲突时,CPU必须清空流水线

处理器如何实现原子操作

处理器通过总线锁和缓存锁的方式来实现原子操作

总线锁:使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住

缓存锁:对应一个内存的不同线程的高速缓存,在操作一个时,其他缓存行全部锁住

跨总线、跨缓存行、跨页:

cpu和内存之间的总线宽度大约36~41位(36~41根导线),单个导线同一时刻传一个电信号;一个缓存行64比特,一个内存页4kb,跨总线、跨缓存行、跨页指的是数据的大小超过单个大小(跨导线可能是long类型的多于41位;缓存行可能是一个批次要处理的数据,不是一个变量;页可能是一个超过4kb大小的综合数据)

锁住总线所有的线程都不能返回,锁缓存与缓存相关的不能返回,但缓存锁有些处理器不支持

Java如何实现原子操作

在Java中可以通过锁和循环CAS的方式来实现原子操作。

循环CAS实现原子操作

JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。Java本身实现不了CAS操作,必须依托于操作系统内核

CAS概述

CAS的全称是 Compare-and-Swap,也就是比较并交换,是并发编程中一种常用的算法。它包含了三个参数:V,A,B。其中,V表示要读写的内存位置,A表示旧的预期值,B表示新值。CAS指令执行时,当且仅当V的值等于预期值A时,才会将V的值设为B,如果V和A不同,说明可能是其他线程做了更新,那么当前线程就什么都不做,最后,CAS返回的是V的真实值。而在多线程的情况下,当多个线程同时使用CAS操作一个变量时,只有一个会成功并更新值,其余线程均会失败,但失败的线程不会被挂起,而是不断的再次循环重试。

从Java 1.5开始,JDK的并发包里提供了一些类来支持原子操作,如

AtomicBoolean(用原子方式更新的boolean值)AtomicInteger(用原子方式更新的int值)AtomicLong(用原子方式更新的long值)

线程安全,在多线程操作时,不需要我们手动加锁和各种同步控制,自己内部已经加了。

这些原子包装类还提供了有用的工具方法,比如以原子的方式将当前值自增1和自减1。

调用方法实现cas

(Java中的cas不仅存在于AtomicInteger一个类中,其他类也可以有)

CAS实现原子操作的三大问题

1.(面试题)ABA问题

如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。cas没有发现的话还会有线程根据最开始的A认为和旧值相同而接着返回

解决方法:加版本号,每次变量更新的时候把版本号加1,那么A→B→A就会变成1A→2B→3A。

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

2.循环时间长开销大,自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销

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

当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁。也可以将多个共享变量变为一个变量(例:ij = 2a)

cas不加锁可以在多线程下保证了计算的正确率,但是在 高并发情况下,会有很多线程在不符合时重新计算(假如有10000个线程进行计算,一个返回后其余9999都需要重新获取数据计算),很大的损耗了cpu的性能。低并发可以,高并发性能不好

锁里面释放锁获取锁都是cas,是因为重量级锁获取锁的时候用cas获取,一旦失败的话停止cas,进入阻塞队列。不是无限的cas

使用锁机制实现原子操作

锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM同步块的时候使用循环CAS的方式来获取锁,当它退出同步块的时候使用循环CAS释放锁。实现锁的方式都用了循环CAS,即当一个线程想进入

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

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

相关文章

GP服务使用本地上传的文件进行分析

1、需求: 自己选择本地的文件上传在gp服务中进行分析,例如实现这个需求: 2、遇到的困境 发布创建TIN工具时要输入值表,但是我这里选择了本地的SHP文件和高程值后,发布出去就是一个常量值了,没法自己选择文…

App与小程序工具总结

文章目录 前言Burpsuite抓包问题LPosedJustTrustMe 绕过 SSL Pining小程序的反编译APP脱壳,反射大师、frida反射大师Frida 总结 前言 在进行渗透工作的时候,遇到过的App、小程序也不少了,有简单的,也有加固的比较不错的&#xff…

【软考】系统集成项目管理工程师(一)信息化基础知识【6分】

一、信息与信息系统 1、信息技术 为解决信息的采集、加工、存储、传输、处理、计算、转换、表现等问题而不断繁荣发展 核心-传输技术(通常指通信、网络等) 2、信息的质量属性 特点:客观性、普遍性 属性描述精确性对事物状态描述的精准程度…

接口幂等性设计的最佳实现

一、什么是幂等 二、为什么需要幂等 三、接口超时了,到底如何处理? 四、如何设计幂等 全局的唯一性ID 幂等设计的基本流程 五、实现幂等的8种方案 selectinsert主键/唯一索引冲突 直接insert 主键/唯一索引冲突 状态机幂等 抽取防重表 token令牌 悲观锁…

stm32之27.iic协议oled显示

屏幕如果无法点亮,需要用GPIO_OType_PP推挽输出,加并上拉电阻 1.显示字符串代码 2.显示图片代码(unsigned强制转换(char*)) 汉字显示

​iOS上架审核宝典:如何避免被拒一次提交成功

Xcode 摘要:本文整理了iOS上架需要注意的事项,以帮助从事iOS开发和App运营的朋友们避免审核被拒的困扰。通过遵循这些指南,我们可以在一次提交中成功地将应用上架,并节省宝贵的时间和精力。 引言: 从事iOS开发和App运…

【一等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「NUFE」解题思路

第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束,大赛官方竞赛平台DataFountain(简称DF平台)正在陆续释出各赛题获奖队伍的方案思路,欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…

AcWing 4405. 统计子矩阵(每日一题)

如果你觉得这篇题解对你有用,可以点点关注再走呗~ 题目描述 给定一个 NM 的矩阵 A,请你统计有多少个子矩阵 (最小 11,最大 NM) 满足子矩阵中所有数的和不超过给定的整数 K ? 输入格式 第一行包含三个整数 N,M 和 K。 之后 N 行每行包含 …

智慧展馆展厅5G+LoRa+蓝牙人员定位系统解决方案

展览业是现代高端服务业的重要组成部分,作为新兴的服务行业,展览业串联着工业、农业、商贸等诸多产业,能够有效拉动产业和消费增长,是中国发展潜力较大的行业之一。如今各个行业越来越多地举办各类展会,由于展馆展厅规…

人体学接口设备 (HID)

参考链接 windows-hardware drivers hid | Microsoft Learnhttps://learn.microsoft.com/pdf?urlhttps%3A%2F%2Flearn.microsoft.com%2Fzh-cn%2Fwindows-hardware%2Fdrivers%2Fhid%2Ftoc.json人体学接口设备 (HID) 简介 - Windows drivers | Microsoft Learnhttps://learn.mi…

遇到 Binder这些面试题,你会怎么答?

作为开发人员,每个人都有每个人擅长领域,自然也有自己不擅长的领域,很难成为完美的一个全栈开发。在面试中最怕遇见的一件事是面试官专挑你不擅长的领域进行提问,目的就是看你遇到问题的应变能力。 接下给大家分享一个面试中容易被…

CUDA小白 - NPP(3) 图像处理 Color and Sampling Conversion

cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化,具体的可以参考别的博主的介绍,都比较详细。还有一些cuda中的专有名词的含义,可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xf…

标准库STL容器使用值语义

C自学精简实践教程 目录(必读) 标准库STL的容器都是值语义的。 即&#xff0c;无法将一个变量放到容器里。容器里存放的只是我们放进去的变量的拷贝&#xff08;副本&#xff09;。 示例&#xff1a; #include <iostream> #include <vector> using namespace s…

【Apollo学习笔记】——规划模块TASK之RULE_BASED_STOP_DECIDER

文章目录 前言RULE_BASED_STOP_DECIDER相关配置RULE_BASED_STOP_DECIDER总体流程StopOnSidePassCheckClearDoneCheckSidePassStopIsPerceptionBlockedIsClearToChangeLaneCheckSidePassStopBuildStopDecisionELSE:涉及到的一些其他函数NormalizeAngleSelfRotate CheckLaneChang…

创建python环境——Anaconda

在Windows中安装Anaconda和简单使用 一.Anaconda发行概述 Anaconda是一个可以便捷获取和管理包&#xff0c;同时对环境进行统一管理的发行版本&#xff0c;它包含了conda、 Python在内的超过180个科学包及其依赖项。 1.Anaconda发行版本具有以下特点&#xff1a; (1)包含了…

Qt实现一个简单的放射式弹出菜单

Qt实现一个简单的放射式弹出菜单 实现效果&#xff1a; GitHub源码 支持特性 可设置弹出选项的起始角度与角度范围 按住中心按钮&#xff0c;可以拖拽窗口 动画支持&#xff0c;可以设置动画时间、选项的延迟弹出 设置菜单的布局对齐、边距&#xff0c;方便根据场景放置在…

YOLO目标检测——蔬菜检测数据集下载分享

YOLO蔬菜检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;共21000张图片。 数据集点击下载&#xff1a;YOLO蔬菜检测数据集21000图片数据说明.rar

科研无人机平台P600进阶版,突破科研难题!

随着无人机技术日益成熟&#xff0c;无人机的应用领域不断扩大&#xff0c;对无人机研发的需求也在不断增加。然而&#xff0c;许多开发人员面临着无法从零开始构建无人机的时间和精力压力&#xff0c;同时也缺乏适合的软件平台来支持他们的开发工作。为了解决这个问题&#xf…

7.Redis-list

list list常用命令lpushlrangelpushxrpushrpushxlpop / rpoplindexlinsertllenlremltrimlset 阻塞版本命令blpop/brpop 总结内部编码应用场景使用redis作为消息队列 redis中的 list 是一个双端队列, list 相当于是数组或者顺序表。list 并非是一个简单的数组&#xff0c;而是更…

matlab使用教程(29)—微分方程实例

此示例说明如何使用 MATLAB 构造几种不同类型的微分方程并求解。MATLAB 提供了多种数值算法来求解各种微分方程&#xff1a; 1.初始值问题 vanderpoldemo 是用于定义 van der Pol 方程的函数 type vanderpoldemo function dydt vanderpoldemo(t,y,Mu) %VANDERPOLDEMO Defin…