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

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

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

1.ABA问题

CAS需要在操作值的时候,检测值有没有发生变化,如果没有发生变化则更新。
但是如果一个值原来是A,变成B,又变成A,那么使用CAS进行检查时会发现它的值没有发生变化,但实际上却发生了变化了。ABA问题的解决思路是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加1,那么A-》B-》A 就会变成 1A-》2B-》3A。
从Java1.5 开始,JDK的Atomic 包里提供了一个类 AtomicStampedReference 来解决ABA的问题。这个类的compareAndSet 方法的作用是首先检查当前的引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
标志就相当于版本号

public boolean compareAndSet(V   expectedReference,//预期引用V   newReference,//更新后的引用int expectedStamp,//预期标志int newStamp// 更新后的标志) {Pair<V> current = pair; // volatile 修饰的变量returnexpectedReference == current.reference &&expectedStamp == current.stamp &&((newReference == current.reference &&newStamp == current.stamp) ||casPair(current, Pair.of(newReference, newStamp)));}

2.循环时间长开销大

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

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

当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对于多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁。还有一个取巧的办法,就是把多个共享变量合成一个共享变量来操作。比如,有两个共享变量 i=2,j=a ,合并一下就是 ij=2a ,然后用CAS操作ij。从java1.5开始,JDK提供了 AtomicReference 类来保证引用对象之间的原子性,就可以把多个变量放到一个对象里进行CAS操作。

使用锁机制实现原子操作

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

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

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

相关文章

Tez 0.9安装部署+hive on tez配置 + Tez-UI

Tez说明 将xyz替换为您正在使用的tez发行版号。例如0.5.0。对于Tez版本0.8.3和更高版本&#xff0c;Tez需要Apache Hadoop版本为2.6.0或更高版本。对于Tez版本0.9.0及更高版本&#xff0c;Tez需要Apache Hadoop版本为2.7.0或更高版本。 关于版本 1.Hadoop 2.7.0&#xff08;我…

iphone 字体

今天在网上找了下&#xff0c;iphone的UITextView字体类型的设置。现总结如下&#xff0c;如有误&#xff0c;欢迎指正。 [textView setFont:[UIFont fontWithName:"TrebuchetMS-Italic" size:18]];但是字体的类型名不好找&#xff0c;总结下有这么些类型&#xff1a…

启动成功浏览器显示不了_移动端利用chrome浏览器在PC端进行调试方法

由于最近工作中遇到需要在电脑上调试手机端的功能和样式&#xff0c;之前也没有遇到过&#xff0c;所以就各种百度和试验。最后终于功夫不负有心人&#xff0c;成功了。(那一刻心情真滴很鸡冻啊~~~~~~~~~)。所以暂时记录下来。以免鸡冻过度再给忘记了。好&#xff0c;接下来就是…

面向对象的相关面试题

1.面向对象的特征有哪些方面? 主要有封装,继承,多态,也可以加上个抽象. 封装 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.在面对对象的编程语言中,对象是封装的最基本的单位,面向对象的封装比…

在maven本地仓库导入jar包

# Dfile jar包所在位置 DgroupId 指定groupId DartifactId 指定artifactId Dversion 指定版本 mvn install:install-file -DfileC:\Users\zlf\Desktop\mybatis-main\target\mybatis.jar -DgroupId"cn.bugstack.middleware" -DartifactIdmybatis -Dversion"1.0.…

Flink完全分布式集群安装

Flink支持完全分布式模式&#xff0c;这时它由一个master节点和多个worker节点构成。在本节&#xff0c;我们将搭建一个如下的三个节点的Flink集群。 一、Flink集群安装、配置和运行 Flink完全分布式集群搭建步骤如下&#xff1a; 1、配置从master到worker节点的SSH无密登录&…

一个4体低位交叉的存储器_前交叉韧带术后关节粘连的康复策略

ACL术后粘连的康复现状在国外&#xff0c;前交叉韧带ACL重建术后关节粘连的发生率为1%。在国内&#xff0c;由于多数医院在行前交叉韧带重建术后&#xff0c;对患者缺少及时、系统、科学的康复治疗&#xff0c;大部分患者由此易发生关节粘连&#xff0c;而往往关节粘连造成的功…

Maven多模块打包

在类似如下的场景中进行打包 lottery-rpc 将出现报错&#xff0c;原因是没办法将 lottery-common 一起打包进去。 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://…

hadoop 2.6.5 + hive 集群搭建

Hadoop 搭建&#xff1a;https://blog.csdn.net/sinat_28371057/article/details/109135056 hive 搭建 1. 系统环境 centos 7.3 Hadoop 2.7.3 jdk 1.8 MySQL安装在master机器上&#xff0c;hive服务器也安装在master上 hive版本: https://mirrors.cnnic.cn/apache/hive/hive…

光耦和开关频率

为什么80%的码农都做不了架构师&#xff1f;>>> TLP250&#xff0c;HCPL3120都可以 直接驱动小型IGBT&#xff0c;不需要加推挽管 6N137&#xff0c;没有推挽&#xff0c;OC上拉&#xff0c;到最后可能驱动速度还上不去 我们6N137&#xff0c;是用来驱动IPM的 电压…

配置babel_Babel 7 下配置 TypeScript 支持

本文将展示&#xff0c;如何使用 babel/preset-typescript 和 babel/preset-env 配置一个最小但完整的编译环境&#xff0c;打包工具使用 webpack4.41.2插件集 preset-typescriptpreset-typescript 是 Babel 提供的预设插件集之一&#xff0c;Babel 官方对其有一篇简短的介绍&a…

jQuery 计时器(jquery timers)简单应用

jquery timers 代码&#xff08;版本1.2&#xff09;&#xff1a; jquery timers /** * jQuery.timers - Timer abstractions for jQuery * Written by Blair Mitchelmore (blair DOT mitchelmore AT gmail DOT com) * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/). …

服务器改用ssh文件登录

首先在服务器生成密钥 ssh-keygen -t rsa -b 4096 将 id_rsa.pub的内容导入到 authorized_keys文件中&#xff0c;这样远程登录时用id_rsa文件登录会与authorized_keys中的文件进行验证。 cat id_rsa.pub >> authorized_keys 关闭ssh密码登录 在 /etc/ssh 下的sshd_conf…

Spark集群完全分布式安装部署

Spark集群完全分布式安装部署下载安装配置Spark 1spark-envsh配置2slaves配置3profile配置复制到其他节点测试总结 Spark集群完全分布式安装部署 本文中所提到的Spark集群所用的系统环境是Centos6.5&#xff0c;共4个节点&#xff0c;前提是Hadoop、JDK都已经安装配置好了&…

抛出错误_不用try catch,如何机智的捕获错误

这是多个feature组合使用后实现的神奇效果&#xff0c;在React源码中被广泛使用。当我读源码看到这里时&#xff0c;心情经历了&#xff1a;懵逼 -- 困惑 -- 沉思 -- 查文档 -- 豁然开朗看完此文&#xff0c;相信你也会发出感叹&#xff1a;还能这么玩&#xff1f;起源我们知道…

js优化工具:ECMAScript Cruncher

利用Thomas Loo开发的ECMAScript Cruncher(ESC 可以http://www.saltstorm.net/depo/esc/或51AJAX.com下载)。ESC是一个小巧的Window Shell脚本。 利用Thomas Loo开发的ECMAScript Cruncher(ESC 可以下载)。ESC是一个小巧的Window Shell脚本。运行ESC&#xff0c;必须使用Window…

ASP.NET 缓存 Cache

ASP.NET 提供一个功能完整的缓存引擎&#xff0c;页面可使用该引擎通过 HTTP 请求存储和检索任意对象.缓存的生存期与应用程序的生存期相同&#xff0c;也就是说&#xff0c;当应用程序重新启动时&#xff0c;将重新创建缓存。 将数据添加到缓存中 1。通过指定其键和值将项添加…

使用Jenkins从gitlab拉取代码并部署以及gitlab更新代码后自动构建

使用Jenkins从gitlab上拉取代码&#xff0c;使用ssh。 创建Jenkins服务器的SSH密钥对&#xff1b;为相应的Gitlab用户添加密钥对的公钥&#xff0c;相当于Jenkins拉取代码时&#xff0c;使用的是该Gitlab用户&#xff0c;拥有其相应的代码克隆权限&#xff1b;Jenkins添加密钥…

wincc版本升级_wincc组态软件下载

wincc7.4中文版这款组态软件是由西门子打造能够为用户们带来众多行业中的各项自动化工业制作效果&#xff0c;广泛运用到钢铁行业以及食品行业&#xff0c;印刷行业中&#xff0c;带给了用户们十分便捷的操作体验&#xff01;wincc中文版介绍由西门子推出的专业数据集与监控软件…

CentOS7.0下Hadoop2.7.3的集群搭建

集群服务器规划 使用3台CentOS-6.8虚拟机进行集群搭建 服务ip主机名称用户HDFSYARNhadoop1192.168.1.40hadoop1root NameNode,Datenode,SecondaryNameNodeResourceManager,NodeManager,hadoop2192.168.1.39hadoop2rootDatenodeNodeManagerhadoop3192.168.1.38hadoop3rootDate…