1.什么是CAS操作?
2.CAS操作用来干什么?
3.java中的CAS操作是怎么实现的?
4.CAS操作有什么优点?有什么缺点?会带来什么问题?怎么解决?


1.Q:什么是CAS操作?
A:
CAS是compare and swap基本过程是:
存在三个值,一个是变量在内存中的值V,一个是该线程期望该变量的值A,另一个是该线程要把该变量修改为的值B。
当线程期望的值等于变量在内存的值时,把该变量修改为值B。

2.Q:CAS操作用来干什么?
A:
CAS可以保证变量的线程安全。(是对变量的操作为原子操作)

CAS可以保证变量的操作是原子操作。从而在只需要保证变量线程安全时,替代synchronized来避免加锁解锁的性能消耗,提高性能。

在jdk1.6后的synchronized锁升级的过程中,轻量级锁使用的就是CAS操作,轻量级锁处理的是有少量线程竞争的情况,CAS操作配上和它关系紧密的自旋操作,这样做的好处也是避免加锁解锁,减少性能消耗。

3.Q:java中的CAS操作是怎么实现的?
A:
用unsafe类调用的native方法实现的,native方法是可以直接访问操作系统底层的c/c++方法

4.Q:CAS操作有什么优点?有什么缺点?会带来什么问题?怎么解决?
A:
优点:在只需要保证变量的线程安全时,可以替代synchronized来避免加锁解锁,降低性能消耗。

缺点:1.当线程竞争大的时候,线程等不到内存中的值和自己期望的值相等,就一直自旋。此时cpu资源负载很大
2.会造成ABA问题

什么是ABA问题?为什么会造成ABA问题?该怎么解决?

ABA过程:
有三个线程:
线程1.期望的值为A,要修改为B
线程2.期望的值为A,要修改为B (被阻塞)
线程3.还没读取值,要修改为A

因为一个请求产生了两个线程,就出了问题。

此刻内存中的值为A,线程1把它修改为B。线程2暂时阻塞,当线程3读取的时候为B,然后把它修改为A。最后线程2看到现在为A,则又把它修改为了B。

这个过程看起来好像没有问题,但是当只有一个请求,却产生两个线程(线程1,线程2)时就会出现问题

举一个银行转账的例子:
用户余额为100,当他转走50时,应该剩下50。然后他又充了50,最后结果应该是100才对。

但是当转钱操作同时两个线程做的时候,线程1先把余额从100修改为了50,线程2暂时阻塞。然后充钱操作,线程3把余额从50修改为了100。但是当线程3看到此时为100,最后则错误地把余额修改为了50。这样就造成了问题。

解决方法是:给线程修改变量(进行CAS,compare and set)时加上版本号

比如转钱操作对应版本号01线程才能修改,线程1不仅变量值对上了,版本号也对上了为01。所以就修改。
到线程2恢复运作时,此时中间已经有多个操作发生,版本号已经变化,因为版本号不一致,所以线程2修改失败

AtomicStampedReference原子类就实现了CAS操作的版本号验证,可以有效解决ABA问题。

加上相应的版本号解决ABA问题的有效方法

3.CAS操作(轻量级锁)相关推荐

  1. java中的CAS操作以及锁机制详解

    关于CAS操作 CAS:Compare And Swap   --  乐观锁策略 CAS(无锁操作):使用CAS叫做比较交换来判断是否出现冲突,出现冲突就重试当前操作直到不冲突为止. 悲观锁(JDK1 ...

  2. .net 延时操作_锁、CAS操作和无锁队列的实现

    (给算法爱好者加星标,修炼编程内功) 来源:yishizuofei blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐 ...

  3. 锁、CAS操作和无锁队列的实现

    锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运:有的人悲观,总会想到不好的一方面,患得患失,所以经常会做不好事.我一直把前一个当作为我前进的动力和方向,快乐充实的过好 ...

  4. 简单理解重量级锁、轻量级锁、偏向锁

    全文使用synchronized来说明. synchronized给对象上锁,先上偏向锁,在上轻量级锁,最后上重量级锁.上什么锁,是gvm根据竞争程度自行变换的. 重量级锁 计算机操作系统本有Moni ...

  5. java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...

  6. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    一.重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理.现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质 ...

  7. Java并发编程—Synchronized底层优化(偏向锁、轻量级锁)

    原文作者:Matrix海 子 原文地址:Java并发编程:Synchronized底层优化(偏向锁.轻量级锁) 目录 一.重量级锁 二.轻量级锁 三.偏向锁 四.其他优化 五.总结 一.重量级锁 上篇 ...

  8. Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...

    文章目录 重量级锁(Mutex Lock) 偏向锁(比较 ThreadID) 偏向锁获取过程 偏向锁的释放 轻量级锁(自旋) 轻量级锁的加锁过程 轻量级锁的释放 总结 重量级锁(Mutex Lock) ...

  9. java 偏向锁 怎么用_Java锁升级、偏向锁、轻量级锁

    偏向锁 当锁对象第一次被线程获取时,虚拟机会把对象头的锁状态标志设置为01(即偏向状态),同时,使用CAS操作把获取到这个锁的线程的ID记录在对象头的mark word中.如果这个CAS操作成功,那么 ...

  10. java轻量级和重量级_Java 偏向锁、轻量级锁和重量级锁

    前言 最开始听到偏向锁.轻量级锁和重量级锁的概念的时候,我还以为是 Java 中提供了相应的类库来实现的,结果了解后才发现, 这三个原来是虚拟机底层对 synchronized 代码块的不同加锁方式. ...

最新文章

  1. LeetCode简单题之找出井字棋的获胜者
  2. 关于JTable的使用
  3. 智能小车设计指导 第二版
  4. c/c++ g++默认编译调用成功,O2优化却发生Segmentation fault
  5. linux grep -v反向搜索:不显示目标字符串
  6. Java字符编码介绍
  7. 7z 头部错误 数据错误_Vue项目组件数据类型错误处理
  8. iOS捕获异常的处理
  9. h2 不能访问localhost_Spring 配置的 H2 控制台 frameOptions 导致无法访问
  10. 使用vue-print-nb插件页面空白以及打印没有样式问题
  11. 人力资源管理书籍排行榜,HR必读的十本书推荐
  12. 回声消除技术--整理编
  13. 电离层对高分辨率星载SAR成像的影响1——电离层的相关定义
  14. ArcGIS 制作中国区的数字高程DEM地图(附中国区STRM 90m DEM百度云免费下载链接)
  15. 群晖服务器无限重启,监控群晖服务状态并自动重启 | 群晖服务控制
  16. hbo切尔诺贝利_HBO Max,HBO NOW和HBO Go有什么区别?
  17. AAAI2019论文
  18. Java011-数组及其常见问题
  19. h264中的pps和sps
  20. C/C++ 数组的初始化

热门文章

  1. nginx负载均衡和高可用
  2. Winpcap的安装使用方法和问题总结
  3. Linux命令+shell脚本大全:文件和目录列表
  4. 一个期货杠杆炒股高手的简单交易方法!
  5. rizomuv缩放排布_Unfold 3D/RizomUV从入门到放弃(一)
  6. 【Matlab】使用C语言编写简单S-Function
  7. AXI总线之AXI FULL总线分析与实现
  8. 深度学习Week14-yolov5s.yaml文件解读(YOLOv5)
  9. Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试
  10. oracle-SCN headroom