java原子类场景,CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题...

CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题(1)CAS是什么?

比较并交换

举例1,  CAS产生场景代码?

importjava.util.concurrent.atomic.AtomicInteger;public classCASDemo {public static voidmain(String[] args) {

AtomicInteger atomicInteger=new AtomicInteger(5);//主物理内存//比较5

System.out.println(atomicInteger.compareAndSet(5, 2019)+"\t current data(主物理内存) : "+atomicInteger.get());//修改失败

System.out.println(atomicInteger.compareAndSet(5, 1024)+"\t current data(主物理内存) : "+atomicInteger.get());

}

}

举例2,  CAS产生场景代码?原子引用

55aee4eff129a2f64f432f56fb999b66.gif

17301.htmlpublic classCAS_ABADemo {public static voidmain(String[] args) {//========================原子引用==========================

User A = new User("A", 123);

User B= new User("B", 456);//主物理内存 引用比较的是地址

AtomicReference atomicReference1 = new AtomicReference<>();

atomicReference1.set(A);

System.out.println(atomicReference1.compareAndSet(A, B)+ "\t" +atomicReference1.get().toString());

System.out.println(atomicReference1.compareAndSet(A, B)+ "\t" +atomicReference1.get().toString());

}

}classUser {

String name;intage;publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}publicUser() {

}public User(String name, intage) {this.name =name;this.age =age;

}

@OverridepublicString toString() {return "User{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

}

原子引用

参考博客:CopyOnWriteArrayList  写时复制----------https://www.cnblogs.com/huangjuncong/p/9160713.html

参考博客:ReentrantLock 独占锁(可重入锁)----------https://www.cnblogs.com/takumicx/p/9338983.html

举例3,ABA问题的产生和解决方案代码场景。

55aee4eff129a2f64f432f56fb999b66.gif

17301.htmlpublic classABADemo {static AtomicReference atomicReference = new AtomicReference<>(100);static AtomicStampedReference atomicStampedReference = new AtomicStampedReference<>(100, 1);public static voidmain(String[] args) {

System.out.println("======ABA问题的产生======");new Thread(() ->{

atomicReference.compareAndSet(100, 101);

atomicReference.compareAndSet(101, 100);

},"t1").start();new Thread(() ->{try{

TimeUnit.SECONDS.sleep(1);

}catch(InterruptedException e) {

e.printStackTrace();

}

System.out.println(atomicReference.compareAndSet(100, 2019) + "\t" +atomicReference.get().toString());

},"t2").start();try { TimeUnit.SECONDS.sleep(2); } catch(InterruptedException e) { e.printStackTrace(); }

System.out.println("======ABA问题的解决======");new Thread(() ->{int stamp =atomicStampedReference.getStamp();

System.out.println(Thread.currentThread().getName()+ "\t第一次版本号: " +stamp);try { TimeUnit.SECONDS.sleep(1); } catch(InterruptedException e) { e.printStackTrace(); }

atomicStampedReference.compareAndSet(100,101,

atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);

System.out.println(Thread.currentThread().getName()+ "\t第二次版本号: " +atomicStampedReference.getStamp());

atomicStampedReference.compareAndSet(101,100,

atomicStampedReference.getStamp(),atomicStampedReference.getStamp()+1);

System.out.println(Thread.currentThread().getName()+ "\t第三次版本号: " +atomicStampedReference.getStamp());

},"t3").start();new Thread(() ->{int stamp =atomicStampedReference.getStamp();

System.out.println(Thread.currentThread().getName()+ "\t第一次版本号: " +stamp);try { TimeUnit.SECONDS.sleep(3); } catch(InterruptedException e) { e.printStackTrace(); }boolean result=atomicStampedReference.compareAndSet(100,2019,

stamp,stamp+1);

System.out.println(Thread.currentThread().getName()+"\t修改成功与否:"+result+" 当前最新版本号"+atomicStampedReference.getStamp());

System.out.println(Thread.currentThread().getName()+"\t当前实际值:"+atomicStampedReference.getReference());

},"t4").start();

}

}

ABA问题的产生和解决方案

(3)CAS实现原子操作的三大问题。

CAS虽然采用自旋的方式高效的解决了原子操作,但任然存在三个问题.

相关文章暂无相关文章

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

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

相关文章

ABP Vnext 批量导入用户,解决密码加密问题

因为ABP Vnext在密码加密方面使用的盐加密的方式&#xff0c;底层的加密方式让人摸不着头脑。如何需要批量导入用户的时候&#xff0c;这个密码问题就很头疼。假设&#xff0c;已经有一个集合List<entity>的用户数据了&#xff0c;此时进行循环取出一条用户信息&#xff…

深入分析JavaWeb Item7 -- HttpServletResponse详解

Web服务器收到客户端的http请求&#xff0c;会针对每一次请求&#xff0c;分别创建一个用于代表请求的request对象、和代表响应的response对象。request和response对象即然代表请求和响应&#xff0c;那我们要获取客户机提交过来的数据&#xff0c;只需要找request对象就行了。…

Spring.net学习记录

Spring.Net功能&#xff1a; 1、控制反转&#xff08;IOC&#xff09;&#xff1a;就是创建对象的权利由开发人员自己控制New&#xff0c;转到了有容器来控制 2、依赖注入&#xff08;DI&#xff09;&#xff1a;就是通过容器来创建对象的时候&#xff0c;在对象初始化时给一些…

uAdmin the Golang Web framework

2019独角兽企业重金招聘Python工程师标准>>> A little over two years ago, I started looking for a web framework like Django for Golang but to my surprise, I couldn’t find anything that even does the basic. My requirements were simple: A standard w…

ABP Vnext 数据库表字段存在IsDeleted如何物理删除HardDeleteAsync

ABP Vnext在写表实体会继承 xxxEntity : FullAuditedAggregateRoot<Guid>此时这个聚合根会包含一个 IsDeleted字段属性&#xff0c;一旦继承了这个软删除字段&#xff0c;你在仓储对象调用 await _xxxxRepository.DeleteAsync(x > x.Id > 0)时的时候&#xff0c;…

详解当当网的分布式作业框架elastic-job

详解当当网的分布式作业框架elastic-job

java条件触发,条件事件触发Anylogic

所以首先event.restart()函数仅在事件具有触发类型时才适用&#xff1a;timeout和mode&#xff1a;user control&#xff0c;否则你的event.restart()函数什么也不做......其次&#xff0c;你需要在有条件的事件上调用你的函数&#xff0c;但是在停车的那一刻......你可以在car…

攻城不易守城更难,汇付天下该如何守住打下来的“江山”?

伴随着相关监管政策的实施&#xff0c;第三方支付市场俨然已经迎来了“罚单潮”。根据不完全统计&#xff0c;截至2018年10月8日&#xff0c;央行已开出109张支付罚单&#xff0c;国付宝等多家支付机构罚金甚至高达千万以上&#xff0c;今年累计处罚的金额已超过2亿元。照此速度…

1024技术论坛 | C#与.NET技术新发展

主办方简介上海维宏电子科技股份有限公司&#xff08;维宏股份&#xff0c;股票代码&#xff1a;300508&#xff09;&#xff0c;是一家专业提供运动控制系统解决方案的高科技企业&#xff0c;公司拥有雄厚的研发力量和高素质的服务队伍&#xff0c;我们以快捷的速度&#xff0…

Oracle Code登录北京 代码盛宴邀你high起来|免费报名

盛夏北京&#xff0c;将迎来 Oracle Code 北京站活动。作为贯穿全年、横跨全球的 20 场活动中的一场&#xff0c;北京站汲取各地 Oracle Code 精华&#xff0c;结合国内开发者社区现状和需求&#xff0c;呈现一场代码盛宴。 来自 Oracle Code、OTN 及 AppsLap 的大咖们将齐聚北…

简单的四则运算

// 20163536 杨宇航 奖励原创 上课未完成原因&#xff1a; 哎&#xff0c;在上那节课时候&#xff0c;我们正在准备程序设计大赛&#xff0c;因为我们团队当中只有我的电脑有数据库&#xff0c;所有我只好将我的电脑贡献给团队了&#xff0c;不然在10分钟内完成应该不成问题&a…

导出导入数据库

一、导出用 mysqldump 备份数据库 1mysqldump -u用户 -p密码 数据库名 > &#xff08;目录&#xff09;导出文件名如&#xff1a;mysqldump -uroot -p123 dbname > /root/test.sql 回车就直接完成备份。如果只需要建表指令&#xff0c;则命令如下&#xff1a; shell> …

matlab randn 范围,请问randn产生的数据在什么范围内变化

产生均值为0&#xff0c;方差 σ^2 1&#xff0c;标准差σ 1的正态分布的随机数或矩阵的函数。Example:产生一个随机分布的指定均值和方差的矩阵&#xff1a;将randn产生的结果乘以标准差&#xff0c;然后加上期望均值即可。例如&#xff0c;产生均值为0.6&#xff0c;方差为…

C#开发串口通信实例及串口基础

一、串口通信简介串行接口&#xff08;串口&#xff09;是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去&#xff0c;同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路&#xff0c;我们称为串行接口电路。串口通信&a…

我在SharePoint行业的从业经历(一)

&#xfeff;&#xfeff;&#xfeff;&#xfeff;大约10年前&#xff0c;我刚刚毕业的时候&#xff0c;找到了一个试用的机会。那个时候的我对软件根本没有概念。编程学的也非常少。仅仅是在系里学过一点VB和C&#xff0c;以为软件就是像QQ或者游戏之类的。我从来没想到会认识…

Linux的学习思路

自学嵌入式确实不大现实&#xff08;当然也不是说没有这个可能&#xff09;&#xff0c;毕竟嵌入式难度也是比较大的。 嵌入式的应用主要是几个方向&#xff0c; 一是系统开发&#xff1a;侧重开发环境搭建、内核原理、交叉编译等&#xff1b; 二是嵌入式Linux应用开发&#xf…

tinycore php,tinycore中文支持

这两天在弄tinycore&#xff0c;想用它来搭个小系统出来。下载最新的CorePlus-current.iso 4.5.2&#xff0c;用开源的usb的安装工具core2usb-1.6.exe将它安装到u盘&#xff0c;然后接上台式机上&#xff0c;开机从u盘启动&#xff0c;一切顺利。好&#xff0c;开始搞起&#…

javascript权威指南--学习笔记

-一、JavaScript基本数据类型 1、数字--Number类 2、字符串--String类 3、布尔--Boolean类 4、函数Function 5、对象Object 6、数组Array 7、null 8、undefined 备注&#xff1a; 当一个未定义的值用于布尔环境&#xff0c;他就会转为false&#xff0c;用于数字环境就会转为…

支持 dotnet 6 的 dnSpy 神器版本

官方的 dnSpy 在 2021 时&#xff0c;由于某些吃瓜的原因 wtfsck 将 dnSpy 给 Archived 掉&#xff0c;在大佬被哄好之前&#xff0c;预计是不再更新。最新官方版本对 dotnet 6 的支持较弱&#xff0c;对于很多 dotnet 6 应用都无法成功调试&#xff0c;附加调试上去将会让应用…

cmd命令

mstsc 开启远程连接services.msc 开启服务sc delete 服务名称 删除服务telnet 106.75.97.193 查看端口是否占用netstat -a 查看端口监听状态