CAS原理

synchronized这种独占锁属于悲观锁,它是在假设一定会发生冲突的,那么加锁恰好有用,除此之外,还有乐观锁,乐观锁的含义就是假设没有发生冲突,那么我正好可以进行某项操作,如果要是发生冲突呢,那我就重试直到成功,乐观锁最常见的就是CAS

我们在读Concurrent包下的类的源码时,发现无论是ReenterLock内部的AQS,还是各种Atomic开头的原子类,内部都应用到了CAS,最常见的就是我们在并发编程时遇到的i++这种情况。传统的方法肯定是在方法上加上synchronized关键字:

public class Test {public volatile int i;public synchronized void add() {i++;}
}
复制代码

但是这种方法在性能上可能会差一点,我们还可以使用AtomicInteger,就可以保证i原子的++了。

public class Test {public AtomicInteger i;public void add() {i.getAndIncrement();}
}复制代码

CAS源码分析

获取偏移量valueOffset,

public native long objectFieldOffset(Field var1);通过这个方法可以知道偏移量从jdk底层源码中获取。

static {try {valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));} catch (Exception ex) { throw new Error(ex); }
}复制代码

然后再看看增加的方法

public final int getAndAdd(int delta) {return unsafe.getAndAddInt(this, valueOffset, delta);
}复制代码
public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;
}复制代码
我们看var5获取的是什么,通过调用unsafe的getIntVolatile(var1, var2),这是个native方法,具体实现到JDK源码里去看了,其实就是获取var1中,var2偏移量处的值。var1就是AtomicIntegervar2就是我们前面提到的valueOffset,这样我们就从内存里获取到现在valueOffset处的值了

compareAndSwapInt(var1, var2, var5, var5 + var4)换成compareAndSwapInt(obj, offset, expect, update)比较清楚,意思就是如果obj内的valueexpect相等,就证明没有其他线程改变过这个变量,那么就更新它为update,如果这一步的CAS没有成功,那就采用自旋的方式继续进行CAS操作

private volatile int value;和unsafe.getAndAddInt(this, valueOffset, delta);
可以看出compareAndSwapInt(obj, offset, expect, update)中的obj为AtomicInteger类型,
AtomicInteger的value值为volatile类型,在看do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));这里是一个dowhile循环,如果obj内的value和expect不相等,
var5 = this.getIntVolatile(var1, var2);一直会
执行,即不断从内存中获取最新的值,来与obj内的value进行比较直到相等为止。从这个字段可以看出复制代码

CAS的缺点

  1. 只能保证对一个变量的原子性操作
  2. 长时间自旋会给CPU带来压力
  3. ABA问题


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

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

相关文章

数据分析师的职业规划之路

“数据分析师作为一个出现时间不长的工种,大数据时代下,成为螺丝钉还是成为龙头,需要尝试新的可能。” 数据分析师手中拥有一座宝藏。作为滴滴出行数据分析团队的负责人,刘普成发现了数据分析师通往卓越的秘诀:视野。数…

《设计模式》3.结构型模式

点击进入我的博客 3.1 适配器模式 适配器模式把一个类的接口变换成客户端所期待的另一种接口,使得原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 3.1.1 类的适配器结构 目标(Target)角色:这就是所期待得到的接口&…

最快的计算机操作,世界十大最快的超级计算机

最近,《联邦储备技术》杂志对全球超级计算机进行了排名,并从中选出了十个最快的超级计算机. 其中,中国有两台超级计算机进入了榜单,而“天河2号”则依靠双精度浮点算术峰. 速度达到了每秒5490亿次,占据了王位.这也是两…

苹果iOS 10.3.1修复博通Wi-Fi芯片重大安全漏洞

如果你还没有将设备升级到 iOS 10.3.1 的话,那么现在是个机会了。因为不久前发布的 iOS 10.3.1,修复了 iPhone 中博通 Wi-Fi 芯片的一个重大安全漏洞,该安全漏洞可能会使在 Wi-Fi 范围内的攻击者在智能手机上注入并运行代码。 Google Project…

计算机开机跳过硬盘检查,如何设置开机跳过检测硬盘

如何设置开机跳过检测硬盘导读:很多win用户都想设置开机跳过检测硬盘,能够更加快速的进入系统,今天百分网小编给大家整理出了方法。1、系统的问题系统解决在Windows界面下,通过“磁盘碎片整理”程序来完成。首先启动“CMD”键入“…

CLIENT系列、OFFSET系列、SCROLL系列

一、client系列 clientWidth/clientHeight 是我们设置的宽和高加上内边距(没有边框) clientLeft/clientTop  就是我们设置的边框值 二、offset系列 offsetWidth/offsetHeight  是我们设置的宽和高加上内边距,加上边框 offsetLeft/offs…

台积电放大招:甩开英特尔 7nm和5nm芯片将诞生

北京时间1月20日消息,据科技网站AppleInsider报道,近几年来台积电的发展势头相当猛,该公司总裁兼联合CEO刘德音(Mark Liu)在最近的投资者会议中表示,预计今年年末公司就将正式量产10nm晶圆。此外,台积电7nm研发一如预期…

01: 实现注册登录功能

目录:抽屉项目之js最佳实践 01: 实现注册登录功能 02: 实现发布帖子功能 03: 将帖子展示到页面、点赞 04: 层级评论 目录: 1.1 显示、隐藏 "登录/注册" 菜单1.2 注册功能1.3 登录功能1.4 获取当前用户数量1.1 显示、隐藏 "登录/注册"…

计算机系统怎么算页面大小,电脑网页的设计尺寸是多少

电脑网页的设计尺寸是多少刚入门的网页设计师可能对电脑网页的设计尺寸大小存在疑问,以下百分网小编整理的电脑网页的设计尺寸,希欢迎阅读!  对大于30W台客户端用户进行测试,得到的测试数据如下(数据来源于网络):安全分辨率为10…

Array 的一些常用 API

unshift、push、shift、pop 这4个方法都会改变原数组unshift() 从前面添加元素,push() 从后面追加元素,返回数组长度shift() 删除第0个元素,pop() 删除最后一个元素,返回被删除的元素slice 不改变原数组slice(m, n)返回原数组索引…

Ovum观察:运营商通信PaaS发展趋势强劲

近日在佛罗里达州奥兰多市举行的Genband公司Perspectives16会议上,一个首要议题是在通信领域应对OTT威胁。 这场会议的主旨侧重于电信运营商和其他服务提供商如何应对日益严重的威胁,不过似乎这样的讨论有些晚了,因为许多大型运营商已经找到了…

WPF 托盘闪烁

WPF 托盘闪烁控件名:NotifyIcon作者:WPFDevelopersOrg - 弈虎、驚鏵原文链接: https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。项目使用 MIT 开源许可协议。接着上一篇基础托盘。新增如下…

电机与系统计算机仿真作业,北邮计算机仿真期末大作业.docx

文档介绍:EvaluationWarning:ThedocumentwascreatedwithSpire..I玮凉爰p電大摩《计算机仿真》MATLAB课程设计报告学院: 自动化学院 专业: 自动化专业 班级: 2010211411姓名: 韩思宇 学号: 10212006 2013年01月14日转子绕线机控制系统综合仿真摘要:转子绕线机的控制系…

Software License Manager

slmgr -ilc lenovo.xrm-ms slmgr -ipk lenovo-lenovo-lenovo-lenovo-lenovo转载于:https://www.cnblogs.com/cuthead/p/license.html

Sqlserver数据库还原一直显示“正在还原…”解决方法

今天在Sqlerver还原数据库时一直就卡在那里提示“正在还原…”的状态,此时无法操作数据库,下面我来给大家介绍解决些问题的方法解决方法: 代码如下复制代码 RESTORE DATABASE demo FROM DISK D:/demo.bak WITH MOVE demo TO d:/demo.mdf, MOVE dem…

Information Retrieval 倒排索引 学习笔记

一,问题描述 在Shakespeare文集(有很多文档Document)中,寻找哪个文档包含了单词“Brutus”和"Caesar",且不包含"Calpurnia"。这其实是一个查询操作(Boolean Queries)。 在U…

计算机地址栏搜索不了网,我的电脑地址栏不见了怎么办 地址栏不见了如何解决...

导语:小编对电脑是比较痴迷的,因此喜欢在自己的电脑上进行各种操作,也经常会碰到一些问题。今天要为大家介绍的是在我的电脑地址栏不见了之后怎么办,熟悉电脑的朋友都能够了解。在我的电脑主界面里面,有一个地址栏&…

实践App内存优化:如何有序地做内存分析与优化

由于项目里之前线上版本出现过一定比例的OOM,虽然比例并不大,但是还是暴露了一定的问题,所以打算对我们App分为几个步骤进行内存分析和优化,当然内存的优化是个长期的过程,不是一两个版本的事,每个版本都需要收集线上内…

php OpenSSL 加解密

2018-1-6 17:10:19 星期六 1 $data 123456;2 $openssl_method AES-256-CBC;3 $openssl_iv_length openssl_cipher_iv_length($openssl_method);4 $openssl_iv openssl_random_pseudo_bytes($openssl_iv_length);5 $openssl_password openssl_random_pseudo_bytes(16);6 7 …

前端应该掌握的网络知识(1)

1、客户端:通过发送请求获取服务器资源的web浏览器等。 2、TCP/IP协议族按层次分为:应用层、传输层、网络层和数据链路层。 应用层决定了向用户提供应用服务时通信的活动。比如:FTP(文本传输协议)和DNS(域名…