java多线程(并发)夯实之路-CAS原理与应用深入浅出

 CAS:保护共享资源的无锁实现

 CAS

CompareAndSet,简称CAS(也有Compare And Swap的说法),它是原子的

它会将pre即之前的值和最新值进行比较,如果相同,修改为next,不同则修改失败  

CAS的底层是lock cmpchg指令(X86架构),在单核和多核CPU下都能保证比较-交换是原子的

使用例子如下:

CAS与volatile

CAS需要volatile支持才能读取到共享变量的最新值实现比较并交换的效果

为什么无锁效率高?

无锁情况下,即使重试失败,线程也在不断运行,而synchronzied会让线程没有锁的时候停止运行,发生上下文切换,进入阻塞(上下文切换成本很高)。

要注意的是,无锁情况下,要保证CPU核心数多于线程数,避免cas线程分不到时间片,发生上下文切换,影响性能

适用场景:CPU核心数多于等于线程数

特点:CAS基于乐观锁的思想,synchronzied基于悲观锁的思想,CAS体现的是无锁并发,无阻塞

并发

CAS应用

原子整数

J.U.C并发包提供了

AtomicBoolean

AtomicInteger

AtomicLong


AtomicInteger方法如下:

updateAndGet原理:用接口的方法具体实现计算结果和cas操作实现

原子引用

原子引用可以使引用类型的变量也能进行cas操作,类型有: AtomicReference

AtomicMarkableReference AtomicStampedReference

AtomicReference例子如下

ABA问题:变量值从A修改为B再修改为A,cas操作仍能够执行成功可以给变量加上一个版本号

AtomicStampedReference(Stamped:时间戳,可以理解为版本号)应用如下

AtomicMarkableReference可以用来判断变量是否被修改过

应用:

原子数组

分为:

AtomicIntegerArray AtomicLongArray AtomicReferenceArray

supplier 提供者 ()-> (一个结果)

function 函数 (一个参数)->(一个结果)                                     

consumer 消费者 (一个参数)-> () 

BiFunction (两个参数)-> (一个结果)                                   

BiConsumer(两个参数)-> ()

原子更新器

字段更新器:

AtomicReferenceFieldUpdater AtomicIntegerFieldUpdater AtomicLongFieldUpdater

字段更新器可以针对对象的某个域(Field)进行原子操作,只能配合volatile修饰的字段使用,否则会出现异常

原子累加器

LongAdder,LongAccumulator是专门的累加类

相对于AtomicLong性能更高,因为LongAdder在有竞争时设置多个累加单元(线程1累加Cell[0],线程2累加Cell[1]...最后结果汇总,累加单元不会超过CPU核心数),减少了CAS重试失败的次数。

LongAdder原理

cas锁,不要用于实践,while(true)会一直运行,降低性能

关键的域:

底层实现:Unsafe

Unsafe对象提供了非常底层的,操作内存,线程的方法,unsafe方法不能直接调用,只能通过反射获得

获取:

unsafe通过内存偏移量定位到属性     

unsafe通过获取到域的偏移地址,再进行cas操作修改值

unsafe模拟实现原子整数

原子整数,原子引用,原子数组,字段更新器,原子累加器底层都是用unsafe实现

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

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

相关文章

Python超详细基础文件操作(详解版)

一、文件操作 1. 文件打开与关闭 1.1 打开文件 在Python中,你可以使用 open() 函数来打开文件。 以下是一个简单的例子: # 打开文件(默认为只读模式) file_path example.txt with open(file_path, r) as file:# 执行文件操作…

M-VAE

Word2Vec c(y) 辅助信息 作者未提供代码

golang 反序列化出现json: cannot unmarshal string into Go value of type model.Phone

项目场景: 今天在项目公关的过程中,需要对interface{}类型进行转换为具体结构体 问题描述 很自然的用到了resultBytes, _ : json.Marshal(result),然后对resultBytes进行反序列化转换为对应的结构体err : json.Unmarshal(resultBytes, &…

通俗易懂实现功能强大的实战项目 springboot+java+vue+mysql 膳食营养健康网站

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

idea2020.1 x64实现git的push

今天还有点时间,顺便写一下这个。 我这边只说一下远程仓库(gitee)的push 点击之后会弹出 点击,弹出 输入你定义的远程仓库名(自己起),以及url,url由下面获取 在你的gitee创建好仓库…

【NI国产替代】PXIe‑6375,208路AI(16位,3.8 MS/s),2路AO,24路DIO,PXI多功能I/O模块

PXIe,208路AI(16位,3.8 MS/s),2路AO,24路DIO,PXI多功能I/O模块 PXIe‑6375提供了模拟I/O、数字I/O和四个32位计数器/定时器,用于PWM、编码器、频率、事件计数等应用。 该设备利用高吞…

OAuth 2.0 - 微信登录

一、概述 1、什么是OAuth 2.0 OAuth (Open Authorization) 是一个关于授权 (athorization) 的开放网络标准。 允许用户授权第三应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方。OAuth在全世界得到广泛应用,目前的版本…

实例分割论文精读:Mask R-CNN

1.摘要 本文提出了一种概念简单、灵活、通用的实例分割方法,该方法在有效地检测图像中的物体同时,为每个物体实例生成一个实例分割模板,添加了一个分支,用于预测一个对象遮罩,与现有的分支并行,用于边界框…

【Unity】【VRTK】【Pico】如何快速在VRTK中引入带动画的PICO控制器

【背景】 之前的VRTK篇章中,我只介绍了Oculus,Open VR,SImulator这三种Rig的配置方法,那么Pico如何融合VRTK进行开发呢? 【需要的开发包】 先像一个正常PICO项目那样导入PICO的SDK到Unity。VRTK 4的Package导入器中搜Pico,可以导入一个Pico的Integration,导入后Projec…

陀螺仪LSM6DSV16X与AI集成(6)----检测自由落体

陀螺仪LSM6DSV16X与AI集成.6--检测自由落体 概述视频教学样品申请源码下载生成STM32CUBEMX串口配置IIC配置CS和SA0设置串口重定向参考程序初始换管脚获取ID复位操作BDU设置 概述 本文介绍如何初始化传感器并配置其参数,以便在检测到自由落体事件时发送通知。 最近…

回归预测 | Python基于ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM多输入单输出回归预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 原创改进, ISSA多策略改进麻雀优化ISSA-CNN-BiLSTM 多输入单输出回归 python代码 优化参数:filter,unints1,units2,学习率(可添加) 以下是三个主要的改进点&…

Echarts折线图中数据根据正负数显示不同区域背景色-配置

示例 Echarts折线图中数据根据正负数显示不同区域背景色 Piecewise 分段类型Continuous 连续类型 Echarts配置 option {backgroundColor: "#030A41",xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun],axisTick: {show: false,},axisLabel: { /…

【Git】本地仓库管理远程库(GitHub)——clone(下载)、commit(添加到本地仓库)、push(提交到远程仓库)、pull(拉取)操作

目录 使用远程仓库的目的将本地仓库同步到git远程仓库 1.克隆远程仓库(clone)2.新建一个文件3.将工作区的文件添加到暂存区4.将暂存区的文件添加到本地仓库(commit)5.提交(同步)到远程仓库(push)6.远程库拉取到本地库(pull)7.团队协作开发和跨团队协作开发(开源项目) 使用远程…

翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二

Streamlit从入门到精通 系列: 翻译: Streamlit从入门到精通 基础控件 一 1. 使用Streamlit显示图表Graphs 1.1 为什么我们需要可视化? 数据可视化通过将数据整理成更容易理解的格式来讲述故事,凸显趋势和异常点。好的可视化能够讲述一个故…

CAN总线报文格式---远程帧(遥控帧)

远程帧(Remote frame) 用于向远程节点请求数据。远程帧可分为标准远程帧和扩展远程帧。(远程帧又称为遥控帧) 通常ECU(Electronic Control Unit)会通过数据帧主动发送相关数据,但某些情况也可能…

redis数据结构源码分析——跳表zset

文章目录 跳表的基本思想特点节点与结构跳跃表节点zskiplistNode属性 跳跃表链表属性 跳表的设计思想和优势API解析zslCreate(创建跳跃表)zslCreateNode(创建节点)zslGetRank(查找排位)zslDelete&#xff0…

jenkins-cl参数化构建

pipeline片段(对应jenkins-cli -p参数的BRANCHdevelop) parameters {string(name: BRANCH, defaultValue: master, description: Enter the branch name)}stages {stage(Get Code) {steps {script {def branch params.BRANCHcheckout scmGit(branches: …

关于AMC8模拟考试延长到1月19日14点,以及常见的几个新问题

相信过去的周末两天,很多参加今年AMC8美国数学思维竞赛活动的孩子们都参加了AMC8模拟考试。昨天有家长问六分成长,周末两天因故没能参加要不要紧?如果还想参加怎么办? 不用担心!官方已经把AMC8模拟考试的时间延长到1月…

c#异形窗体遮罩效果

c#异形窗体遮罩效果,移动,关闭,最大化,最小化,还原操作 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D…

《WebKit 技术内幕》之二: HTML 网页和结构

第二章 HTML 网页和结构 HTML网页是利用HTML语言编写的文档,HTML是半结构化的数据表现方式,它的结构特征可以归纳为:树状结构、层次结构和框结构。 1.网页构成 1.1 基本元素和树状结构 HTML网页使用HTML语言撰写的文档,发展到今…