首页 > 其他分享 >CAS解析

CAS解析

时间:2024-03-03 23:34:07浏览次数:21  
标签:CAS Unsafe value int 内存 oldValue 解析

目录

什么是CAS

  • 应用场景:并发

  • 我认为V的值应该是A,如果是的话,那我就把它修改成B,如果不是A(说明被别人修改过了),那我就不修改了,避免多人同时操作导致出错。

  • CAS有三个操作数:内存值V、预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才将内存值修改为B,否则什么都不做,最后返回现在的V值。

    image-20240303163709521

  • 利用了CPU的特殊指令

  • CAS的等价代码(语义)

public class SimulatedCAS {

    private volatile int value;

    /**
     * 使用synchronized保证其原子操作
     * @param expectValue
     * @param newValue
     * @return
     */
    public synchronized int compareAndSwap(int expectValue,int newValue){
        int oldValue = value;
        if(oldValue == value){
            value = newValue;
        }
        return oldValue;
    }
}

应用场景

  • 乐观锁

  • 并发容器

  • 原子类

以AtomicInteger为例,分析在Java中如何利用CAS实现原子操作的

image-20240303170602380

  • AtomicInteger加载Unsafe工具,用来直接操作内存数据
  • 用UnSafe来实现底层操作
  • 用volatile修饰value字段,保证可见性
  • getAndAddInt方法分析

Unsafe类

image-20240303171011243

Unsafe类中的compareAndSwapInt

image-20240303171109141

Unsafe的native实现方法底层源码, Atomic::cmpxchg(x,addr,e),

image-20240303171226170

缺点

  • ABA问题:添加版本号解决
  • 自旋时间过长 do while

标签:CAS,Unsafe,value,int,内存,oldValue,解析
From: https://www.cnblogs.com/shine-rainbow/p/18050991

相关文章

  • pod常见的非故障及故障状态解析
    在Kubernetes中,Pod的状态可以反映其当前的生命周期状态、是否正常运行或遇到了某些状况。以下是一些Pod常见的非故障状态:Running:这是Pod最常见的非故障状态,表示Pod已经成功调度到了一个节点上,并且其中所有的容器都已经被成功创建,至少有一个容器正在运行。Succeeded:这个状态通常......
  • [详解-vector] C++必知必会 vector常用各种操作解析
    原文转载自知乎:https://zhuanlan.zhihu.com/p/648650828vector是C++标准库中的一个动态数组容器,它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小。它是一个非常常用且强大的容器,用于存储一系列元素。下面详细介绍vector的使用方法,并提供相应的代码案例。1.包含......
  • python接口自动化系列(06):解析初始化sql
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/18033074实现目标将initSql中常用变量占位符(下图划线的)替换为实际值。 添加替换变量工具模块substitution_tool.py#!/usr/bin/envpython#-*-coding:utf-8-*-#@Author:韧#@wx:ren168632201#@Bl......
  • 问题:图片解析后url路径解析发生改变
    背景:解析站长素材首页的图片看程序执行在我执行完程序之后显示爬取成功但是并没有爬取到图片找错过程把settings中的LOG_LEVEL="ERROE"改成WARNING 就发现了警告信息于是我又进行输出url发现了本身爬取的url没有问题但是用Request解析的时候就发现了解析错了就......
  • Modbus字节序说明-汇川PLC用littly endine byte swap【低位优先传输且反序】 解析寄存
    Modbus字节序说明-汇川PLC用littlyendinebyteswap解析寄存器最近做ModBusTCP方面的测试有点多,尽管对于ModBus协议算是比较了解了,也经常知道字节传输序列的不同对工程师带来了很多不必要的麻烦,这不是一个技术难题,仅仅只是过去各家各户开发遗留下来的标准统一问题,所以这里写下......
  • mainCRTStartup 函数解析
    mainCRTStartup函数解析 操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置,不同的连接器选择的入口函数也不尽相同。在VC++下,连接器对控制台程序设置的入口函数是mainCRTStartup,mainCRTStartup再调用main函数 mainCRTStartu......
  • scrapy—图片解析(图片懒加载)
    笔记-图片数据爬取之ImagesPipeline-基于scrapy爬取字符串类型的数据和爬取图片类型的数据区别?-字符串:只需要基于xpth进行解析且提交管道进行持久化存储-图片:xpath解析出图片src属性值。单独的对图片地址发起请求获取图片二进制类型的数据-Imag......
  • Glide源码解析四(解码和转码)
    本文基于Glide4.11.0Glide加载过程有一个解码过程,比如将url加载为inputStream后,要将inputStream解码为Bitmap。 从Glide源码解析一我们大致知道了Glide加载的过程,所以我们可以直接从这里看起,在这个过程中我们以从文件中加载bitmap为例:DecodeJob的一个方法:privatevoiddec......
  • 常见的数据库语句解析
    创建表的时候,一般都会在结尾写上这些代码:ENGINE=InnoDBAUTO_INCREMENT=70defaultcharset=utf8mb3collate=utf8mb4_bincomment='';我经过学习后简单了解了这些语句的作用:ENGINE=InnoDB:指定了表的存储引擎为InnoDB,InnoDB是MySQL的一种存储引擎,提供了事务处理和外......
  • 各种类型json解析
    usingNewtonsoft.Json;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Web.Script.Serialization;namespaceAnalysisJson{classProgram{staticvoidMain(string[]args......