Java的CAS操作

这篇具有很好参考价值的文章主要介绍了Java的CAS操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

介绍 CAS

技术是为了解决问题而生的,通过 CAS 我们可以以无锁的方式,保证对共享数据进行 “读取 - 修改 - 写回” 操作序列的正确性。

CAS 是乐观锁设计思想的实现。CAS 的思想是:在“读取 - 修改 - 写回”操作序列中,先读取并修改数据,写回数据前先判断读取数据后的这段时间内数据是否发生变化(共享变量的当前值是否是我们的期望值):

  • 如果在此期间数据没有发生变化(共享资源的当前值是我们的期望值),那么就把修改后的值写回
  • 如果在此期间其他的线程修改了数据,数据发生了变化(共享资源的当前值不是我们的期望值),那么就放弃本次写回操作,再基于最新的数据进行修改然后重试,避免发生数据更新丢失

CAS 更加底层的实现依赖于 CPU 提供的特定指令,具体根据体系结构的不同还存在着明显区别。比如,x86 CPU 提供 cmpxchg 指令;而在精简指令集的体系架构中,则通常是靠一对指令(如“load and reserve”和“store conditional”)实现的。在大多数处理器上 CAS 都是非常轻量级的操作,这也是其优势所在。

Java 的 CAS 操作

CAS 依赖于 Unsafe 类提供的一些底层能力,进行底层操作。

/**
 * Atomically update Java variable to x if it is currently
 * holding expected.
 * @return true if successful
 */
public final native boolean compareAndSwapInt(Object o, long offset,
                                              int expected,
                                              int x);

在调用 compareAndSwap() 方法时,我们需要传入需要修改的共享变量、对象偏移量、我们期望的变量当前值、要写回的值。如果变量的当前值和我们的期望值相等,则写回成功,返回 true,否则写回失败,返回 false。

Unsafe 类是 Java 提供的一个操作内存的非安全类,操作对象和对应的变量来完成 CAS 操作。显然 Unsafe 类过于底层,调用 Unsafe 类的方法不是大多数应用场景的最好选择。目前 Java 提供了两种公共 API,可以实现 CAS 操作:

  • 一种是 Atomic 原子类。Atomic 包中的类对 Unsafe 类进行了封装,使我们可以更方便的使用 CAS 操作。Atomic 包提供了常见的原子性数据类型,甚至是引用、数组等相关原子类型和原子更新操作工具。
  • 还有一种是 Variable Handle API,它源自于JEP 193,提供了各种粒度的原子或者有序性的操作等。

CAS 的优劣局限

CAS 的优点:在大多数处理器上 CAS 都是非常轻量级的操作。


CAS 的局限:文章来源地址https://www.toymoban.com/news/detail-452926.html

  • CAS 操作是针对一个共享变量的,如果需要解决多个变量的原子性问题,建议还是使用互斥锁方案。
  • 存在 ABA 问题:当一个线程在进行 CAS 操作时,另一个线程可能会在此期间修改了同一个共享变量的值,然后又将其改回原来的值。这种情况下,CAS 操作就无法检测到共享变量值的变化,从而导致 ABA 问题。如果我们仅仅在写回数据前判断数值是 A,可能导致不合理的写回操作。针对这种情况,Java 提供了 AtomicStampedReference 工具类,通过为对象引用建立类似版本号(stamp)的方式,来解决 ABA 问题,保证 CAS 的正确性。
  • 如果有大量的线程同时对一个共享变量进行 CAS 操作,竞争过于激烈的情况下,尝试进行 CAS 操作的线程只会白白消耗处理器资源,而不会做任何有价值的工作,这就会带来性能的浪费。

到了这里,关于Java的CAS操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java进阶(ConcurrentHashMap)——面试时ConcurrentHashMap常见问题解读 & 结合源码分析 & 多线程CAS比较并交换 初识

    List、Set、HashMap作为Java中常用的集合,需要深入认识其原理和特性。 本篇博客介绍常见的关于Java中线程安全的ConcurrentHashMap集合的面试问题,结合源码分析题目背后的知识点。 关于List的博客文章如下: Java进阶(List)——面试时List常见问题解读 结合源码分析 关于的Set的博

    2024年02月06日
    浏览(42)
  • 【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍

    本文主要针对于综合层面上进行分析JVM优化方案总结和列举调优参数计划。主要包含: 调优之逃逸分析(栈上分配) 调优之线程局部缓存(TLAB) 调优之G1回收器 -XX:+DoEscapeAnalysis 逃逸分析(Escape Analysis) 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定

    2024年01月25日
    浏览(46)
  • 原子操作CAS

    悲观锁 具有强烈的独占和排他特性。在有悲观锁的情况下,对数据进行处理,数据会处于锁定状态。前面讲到的synchronized同一时间 只允许一个线程访问某块资源 ,其他线程处于阻塞状态,就是一个独占锁,是悲观锁中的一种。 悲观锁适用于写操作比较多的场景。 乐观锁 对

    2024年02月13日
    浏览(24)
  • 【JAVA】云HIS系统使用和操作过程中的常见问题及解决方法

    一、门诊业务中遇到的问题 (1)门诊医生如何查询往期病人? 答: 点击门诊医生站左侧患者列表,在弹出的页面点击已诊分页,在搜索框输入患者姓名,在结果中找到对应患者,点击详情按钮即可查询患者往期就诊信息,点击想要查询的门诊记录前方的方框即可查询相应的

    2024年02月16日
    浏览(36)
  • Docker自定义java镜像(解决java:8镜像不支持arm64/aarch64的问题)(附带Dockerfile参数介绍)

    arm64/aarch64的云服务器、已经安装好docker、已经安装好对应版本且可以使用的jdk、服务器上有该jdk的安装包 (如:jdk-8u311-linux-aarch64.tar.gz) #打包镜像 注意有后缀 . Dockerfile的命令ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 (1)基础 每一条保留

    2024年02月09日
    浏览(30)
  • 解决Tomcat异常:java.lang.IllegalStateException: 非法访问:此Web应用程序实例已停止。无法加载。为了调试以及终止导致非法访问的线程,将抛出以下堆栈跟踪。

    调试项目的时候发现每次使用idea重新部署项目时会出现这个错误,但是不影响实际使用,重启服务器第一次部署时也不会出现错误,尝试搜索解决这个问题。 解决方法: 进入tomcat目录下查找配置文件,conf Context.xml,查找Context标签,修改属性reloadble为 reloadable=“false” (如果

    2024年02月04日
    浏览(38)
  • 为了简写这行代码,我竟使用静态和动态编译技术

    在我们系统中有这么一个需求,业务方会通过mq将一些用户信息传给我们,我们的服务处理完后,再将信息转发给子系统。mq的内容如下: 主要分为两部分,第一部分是用户id,这部分用于唯一标识一个用户,不会改变。第二部分是一些基础信息,账单、订单、联系方式、地址

    2024年02月07日
    浏览(25)
  • 详解CAS及ABA问题

    🌈🌈🌈今天给大家分享的是 CAS 问题。 清风的CSDN博客 🛩️🛩️🛩️希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! ✈️✈️✈️动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛 目录 一、什么是CAS  1

    2024年01月20日
    浏览(25)
  • Java——》CAS

    推荐链接:     总结——》【Java】     总结——》【Mysql】     总结——》【Redis】     总结——》【Kafka】     总结——》【Spring】     总结——》【SpringBoot】     总结——》【MyBatis、MyBatis-Plus】     总结——》【Linux】     总结——》【MongoDB】    

    2024年02月05日
    浏览(33)
  • 【Java多线程进阶】CAS机制

    前言 CAS指的是Compare-And-Swap(比较与交换),它是一种多线程同步的技术,常用于实现无锁算法,从而提高多线程程序的性能和扩展性。本篇文章具体讲解如何使用 CAS 的机制以及 CAS 机制带来的问题。 目录 1. 什么是CAS? 2. CAS的应用 2.1 实现原子类 2.2 实现自旋锁 3. CAS的ABA问

    2024年02月10日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包