CAS(比较并交换)学习CAS实现原子性+volatile实现可见性,cas与synchronized比较的优缺点

在这里插入图片描述

1、CAS底层原理?

自旋锁(cas思想)+unsafe类,保证原子性靠的是unsafe类

1.首先可以看到:

atomicInteger.getAndIncrement();

getAndIncrement()的底层是

    public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}

this指的是当前对象,valueoffset是偏移量(因为unsafe类是根据内存偏移地址获取数据),1是自增值

2.下面看下getAndAddInt(this, valueOffset, 1);底层

    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;}

var1:AtomicInteger对象本身
var2:该对象值的引用地址
var4:需要变动的数量
var5:是通过var1、var2找出的主内存中真是的值
用该对象当前的值与var5比较:
如果相同,更新var5+var4并返回true;
如果不相同,继续取值比较直到更细完成;

2、通过下面例子来更好的理解一下:

在这里插入图片描述

3、cas与syncronized比较

为什么要用cas而不用syncronized?
因为syncronized加锁同一时间段只能有一个线程访问,一致性得到了保证,但是并发性下降,cas底层用do while来比较更新,既保证了一致性也保证了并发性。

4、cas的缺点?

1、循环时间长,cpu开销大(do while如果cas失败,一直尝试,长时间不成功,会造成cpu开销很大)
2、只能保证一个共享变量的原子操作(多个变量不能保证,只能用加锁)
3.引出了ABA问题(最重要的)ABA问题分析与解决

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

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

相关文章

cas引出的ABA问题?如何解决?- 理解原子引用、时间戳(版本号)原子引用

ABA问题: 假如有两个线程1,2; cas下:1.线程取值完等待,2线程取值并把A改成B,有把B改成A,这是1线程执行会任务A还是原来的A没有发生改变,如果不在乎中间结果,只看收尾&am…

java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)

1.公平锁、非公平锁 2.可重入锁(递归锁) 3.自旋锁 AtomicReference atomicReference new AtomicReference();//原子引用线程下面代码5秒钟自旋了10万次,还是很消耗CPU的 package HighConcurrency;import java.util.concurrent.TimeUnit; imp…

CountDownLatch,同步辅助类

public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 假设定义一个计数器为 5。每个线程完成任务后计数减1计数器减为 0 则通知等待的线程。 用给定的计数 初始化 Count…

CyclicBarrier-同步辅助类

与CountDownLatch相反,CyclicBarrier是做加法 public class CyclicBarrierextends Object一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必…

阻塞队列-BlockningQueue

阻塞队列的前言介绍引用于https://www.cnblogs.com/aspirant/p/8657801.html,写的挺好有兴趣可以看一看 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的…

多线程下的生产者消费者(一个初始值为0的变量,两个线程一个加1一个减1,轮询5轮)

在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了。配合Object的wait()、notify()系列方法可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式 下面用的是lock锁 …

阻塞队列,来写生产者消费者,生产一个消费一个

用阻塞队列来写,就不需要程序员来关心什么时候阻塞线程await,什么时候唤醒线程notify()。 类似消息中间件 package JUC;import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import…

线程池ThreadPool,线程池底层ThreadPoolExecutor方法七大参数,拒绝策略,以及实际开发中高并发下用到哪个线程池?

为什么要用线程池 基本的三个线程池的底层就是ThreadPoolExecutor类 ExecutorService threadPool Executors.newFixedThreadPool(int);//固定线程数的线程池,,执行长期的任务,性能好 ExecutorService threadPool Executors.newSingleThrea…

【转】2.1.1 购买阿里云服务器(Ubuntu系统)

购买阿里云服务器 优惠购买链接 戳我购买 Cpu和内存 M2对服务器配置要求比较高, cpu要大于等于1, 内存要大于等于2 选择Ubuntu镜像 最好用官方提供的公共镜像,不要用第三方的。 其他的配置 其他的配置按你自己的需求来选择。 控制台 购买完成后…

死锁编码及定位分析(故障排查)

什么是死锁? 在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只能通过中止并重启的方式来让程序重新执行。 造成死锁的原因: 当前线程拥有其他线程需要的资源当前线程等待其他线程已…

【转】在win10接双显示器(扩展模式)怎么把鼠标游标切换到第二台显示器上?

作者:朱宁 链接:https://www.zhihu.com/question/50002939/answer/120465673 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 使用软件 DisplayFusion Pro 这个软件体量比较大,蓝…

java单例模式(饿汉式和懒汉式的几种不同写法)

1.饿汉式(直接创建)三种创建方法代码里面都有 第三种静态代码块方式,需要创建个properties文件 package java2;import java.io.IOException; import java.util.Properties;/*** 单例模式设计步骤:* 1.构造器私有化* 2.内部创…

【转】一键将Web应用发布到云-Azure Web App!

我们现在越来越多的传统应用,逐步向云端迁移,原先私有云的部署模式,逐步向云端PaaS IaaS转变。例如: 我们在云端Azure中申请VM虚拟机,将我们的Web应用部署到VM的IIS中,同时做云服务的高可用性集和NLB&…

jvm详解、GC、堆内存参数调优

一些常见面试题: JVM的位置(运行在操作系统上,与硬件没有直接的交互) 一、jvm体系结构(记住背下来) 运行时数据区:有亮色的有灰色的,灰色的就是占得内存非常小,几乎不存…

【转】!Dynamics 365 Online通过OAuth 2 Client Credential授权(Server-to-Server Authentication)后调用Web API

微软动态CRM专家罗勇 ,回复332或者20190505可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 本文很多内容来自 John Towgood 撰写的Dynamics 365 Online Authenticate with Client Credentials &#xff0c…

JMM(java内存模型)

这篇文章写得挺好的:https://blog.csdn.net/javazejian/article/details/72772461 在多线程环境下,线程之间的要通信,就不得不提JMM(java内存模型) 在JVM内部使用的java内存模型(JMM)将线程堆栈和堆之间的内存分开 jmm的承诺: 1.原子性 2.可…

【转】Postman 生成接口文档

引言 几个朋友想做一个前后端分离的项目,接口文档的重要性那是不言而喻的。生成接口文档的方法真的太多了,Yapi、Swagger等等。但是想公网上访问接口文档并修改的话,还得购买服务器,部署上去。穷码农,哪有钱购买服务器…

JVM的进阶学习(GC Roots、JVM调优与参数配置、)

1. GC Roots,可达性分析 从GC roots的对象作为起始点,从GC Roots对象开始向下搜索,如果一个对象到GCRoots没有任何引用链相连,则说明对象不可用。即给定一个集合的引用作为根出发,通过引用关系遍历对象图,能…

【转】图解phpstorm常用快捷键

转载自 https://segmentfault.com/a/1190000004225643 查询快捷键 CTRLN 查找类 CTRLSHIFTN 全局搜索文件 ,优先文件名匹配的文件 CTRLSHIFTALTN 查找php类名/变量名 ,js方法名/变量名, css 选择器 CIRLB 找变量的来源,跳到变量申明处 (CTRL 鼠标单击 也可以) CTRL…

HQL写topN、Spark写topN

HQL写topN用窗口函数rank() 、row_number()、dense_rank() 1、rank(),跳跃排序,假如第一第二相同,那么第三个就是3 select * from( select id, cn, score, rank() over(partition by id order by score desc)as ranks from top N ) A where ranks&…