CAS乐观锁原理

news2024/9/22 21:13:29

1、什么是CAS?

compare and swap也就是比较和交换,他是一条CPU的并发原语。

他在替换内存的某个位置的值时,首先查看内存中的值与预期值是否一致,如果一致,执行替换操作。
这个操作是一个原子性操作。

Java中基于Unsafe的类提供了对CAS的操作的方法,JVM会帮助我们将方法实现CAS汇编指令但是要清楚CAS只是比较和交换,在获取原值的这个操作上,需要你自己实现。

public class AtomicIntegerTest {

    public static AtomicInteger atomicInteger = new AtomicInteger(0);
    public static void main(String[] args) {

        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                int i1 = atomicInteger.incrementAndGet();
                System.out.println(i1);
            }
        }).start();


        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                int i1 = atomicInteger.incrementAndGet();
                System.out.println(i1);
            }
        }).start();
    }
}

Doug Lea在CAS的基础上帮助我们实现了一些原子类,其中就包括现在看到的Atomicinteger,还有其他很多原子类.

CAS的缺点:CAS只能保证对一个变量的操作是原子性的,无法实现对多行代码实现原子性。

CAS的问题:
·ABA问题:问题如下,可以引入版本号的方式,来解决ABA的问题。Java中提供了一个类在CAS时,针对各个版本追加版本号的操作。AtomicStampeReference

CAS 线程的ABA问题

初始值为str=A ,此时线程1修改str A 为B ,线程2修改str B为A ,此时线程3看到了还是A,但是此时的A已不是最初的那个A了,此时线程存在ABA问题。

public class AtomicInteger2Test {
    public static void main(String[] args) {
        //初始值
        AtomicReference<String> stringAtomicReference = new AtomicReference<>("A");

        //线程1进行修改
        new Thread(() -> {
            boolean b = stringAtomicReference.compareAndSet("A", "B");
            System.out.println(Thread.currentThread().getName() + ":" + b);
            System.out.println(Thread.currentThread().getName() + ":" + stringAtomicReference.get());
        }, "t1").start();

        //线程2进行修改
        new Thread(() -> {
            boolean b = stringAtomicReference.compareAndSet("B", "A");
            System.out.println(Thread.currentThread().getName() + ":" + b);
            System.out.println(Thread.currentThread().getName() + ":" + stringAtomicReference.get());
        }, "t2").start();


        //线程3进行修改
        new Thread(() -> {
            boolean b = stringAtomicReference.compareAndSet("A", "B");
            System.out.println(Thread.currentThread().getName() + ":" + b);
            System.out.println(Thread.currentThread().getName() + ":" + stringAtomicReference.get());
        },"t3").start();
    }
}

如何进行ABA问题的避免呢?

public class AtomicStampReferenceTest {
    public static void main(String[] args) {
        AtomicStampedReference<String> initVal = new AtomicStampedReference<String>("A",1);

        //线程1进行修改
        new Thread(()->{
            boolean b = initVal.compareAndSet("A", "B", 1, 2);
            System.out.println(Thread.currentThread().getName()+"线程修改结果:"+b);
        },"t1").start();


        //线程2进行修改
        new Thread(()->{
            boolean b = initVal.compareAndSet("B", "A", 2, 3);
            System.out.println(Thread.currentThread().getName()+"线程修改结果:"+b);
        },"t2").start();

        //线程3进行修改
        new Thread(()->{
            boolean b = initVal.compareAndSet("A", "B", 1, 2);
            System.out.println(Thread.currentThread().getName()+"线程修改结果:"+b);
        },"t3").start();
    }
}

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

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

相关文章

学生选课表练习(面试题)

一、表结构&#xff1a; 学生表&#xff1a;Student&#xff08;编号sid&#xff0c;姓名sname&#xff0c;生日birthday&#xff0c;性别ssex&#xff0c;班级 classid) 课程表&#xff1a;Course&#xff08;课程编号cid&#xff0c;课程名称cname&#xff0c;教师编号tid&a…

《0基础》学习Python——第十九讲__爬虫/<2>

一、用get请求爬取一般网页 首先由上节课我们可以找到URL、请求方式、User-Agent以及content-type 即&#xff1a;在所在浏览器页面按下F12键&#xff0c;之后点击网路-刷新&#xff0c;找到第一条双击打开标头即可查看上述所有内容&#xff0c;将上述URL、User-Agent所对应的…

高考完的假期想学c语言 要注意那些问题?

在高考完的假期学习C语言是一个非常好的选择&#xff0c;可以为以后大学的专业学习打下坚实的基础。我收集制作一份C语言学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向&#xff0c;包括了编程教学&#xff0c;数据处理&#xff0c;…

参考椭球体与坐标系|大地水准面|地理坐标系|投影坐标系|EPSG|SRID

相关概念之间的关系: 大地水准面 **大地水准面(Geoid)**是海洋表面在排除风力、潮汐等其他影响后&#xff0c;只考虑重力和地球自转影响下的形状&#xff0c;这个形状延伸过陆地生成的一个密闭的曲面。 简单来说&#xff1a;就是一个假想的由地球自由静止的海水平面&#xf…

最新matlab2024a安装教程

一、软件领取 领取方式&#xff1a; https://pan.baidu.com/s/1TeH5F7ilPQVeLc9S9eDmSQ?pwdqot6 二、安装步骤 1、右击下载好的安装包&#xff0c;选择解压缩。&#xff08;用电脑自带的解压功能或解压软件都可以&#xff0c;我这里用的电脑自带的&#xff09; 2、打开…

购物车案例(源码分享)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

3D建模软件--犀牛Rhino for Mac

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

中国城市房地产政策汇总数据(1957-2024.7)

房地产政策是ZF为了引导和调控房地产市场&#xff0c;确保其健康稳定发展而制定的一系列法律法规和行政措施。包括政策类型、政策内容、限价、限购、土地供应、人才政策等&#xff0c;旨在平衡供需、稳定房价、保护消费者权益、促进资源合理配置及维护市场秩序。包括1957年以来…

看准JS逆向案例:webpack逆向解析

&#x1f50d; 逆向思路与步骤 抓包分析与参数定位 首先&#xff0c;我们通过抓包工具对看准网的请求进行分析。 发现请求中包含加密的参数b和kiv。 为了分析这些加密参数&#xff0c;我们需要进一步定位JS加密代码的位置。 扣取JS加密代码 定位到JS代码中的加密实现后&a…

C++ 基础和基本语法

文章目录 1. 简介 2. 基本解释 示例解释 3. 程序结构 HELLO WORLD 编译 & 执行 C 程序 4. 分号 和 语句块 5. 标识符 6. 关键字 7. 注释 1. 简介 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xff0c;支持过程化编程、面向对象编…

【HCIA-综合实验】

实验拓扑 实验要求 总经理VLAN2 财务部VLAN3 销售部VLAN4 DNS服务器VLAN5。SW3为VLAN2 3 4 5的网关&#xff0c; SW3启用接口地址池为VLAN2 3动态分配地址。交换机连接终端开启边缘端口&#xff0c;并进行BPDU保护&#xff0c;在SW1和SW2、SW3进行STP优化。R1和SW3链路聚合&am…

Linux 内核模块加载知多少

文章目录 目录 1. 内核模块 内核模块的作用 2. 内核模块的加载 2.1 内核模块的加载过程 2.2 内核模块加载方式 使用 insmod 加载模块 使用 modprobe 加载模块 2.3 内核模块加载顺序 3. 常用的相关命令 4. 总结 工作还在继续&#xff0c;学习还在继续&#xff0c;学习…

【算法/学习】前缀和差分

前缀和&&差分目录 1. 前缀和的概念及作用 &#x1f308;概念 &#x1f308;用途 &#x1f319;一维前缀和 &#x1f319;二维前缀和 2. 差分的概念及用途 &#x1f308;概念&#xff1a; &#x1f308;用途 &#x1f319;一维差分 &#x1f319;二维差分 1. …

sap 权限控制例子

文章目录 1 T-code2 Method3 Summary 1 T-code We use t-code is ‘su21’ and ‘PFCG’ . Creat Authorization objects . Create role 2 Method DATA: zbz(1).CLEAR:zbz.SELECT SINGLE COUNT(*) FROM agr_users WHERE uname sy-uname AND agr_name ZMM_PRICE001.&q…

redis全局唯一ID生成策略、countDownLatch、Lambda表达式总结

redis全局唯一ID生成策略 一、有哪些生成全局唯一ID的策略二、使用Redis自增1. 分析2. RedisIdWorker配置类3 单元测试注解分析&#xff08;难点较多&#xff09;3.1 countDownLatch前言3.2 常用方法 一、有哪些生成全局唯一ID的策略 二、使用Redis自增 1. 分析 2. RedisIdWor…

《数据结构1800题》基础回合总结——第1章 绪论

前言&#xff1a;《数据结构1800》这本书相信大家或多或少都有所耳闻&#xff0c;收录了诸多不同档次学校的考研真题&#xff0c;因为和汤老师的1800撞名所以备受调侃。这1800道题目里面有选择有填空&#xff0c;也有简答和一些编程题&#xff0c;总的来说质量良莠不齐——亦或…

Transformer之Swin-Transformer结构解读

写在最前面之如何只用nn.Linear实现nn.Conv2d的功能 很多人说&#xff0c;Swin-Transformer就是另一种Convolution&#xff0c;但是解释得真就是一坨shit&#xff0c;这里我郑重解释一下&#xff0c;这是为什么&#xff1f; 首先&#xff0c;Convolution是什么&#xff1f; Co…

GaussianPro使用笔记

1. 介绍 GaussianPro: 3D Gaussian Splatting with Progressive Propagation 3D高斯分布(3DGS)最近以其高保真度和效率彻底改变了神经渲染领域。然而&#xff0c;3DGS在很大程度上依赖于运动结构&#xff08;SfM&#xff09;技术生成的初始化点云。当处理不可避免地包含无纹理…

语音识别 语音识别项目相关笔记内容

语音识别 语音识别项目相关笔记内容 语音识别应用范畴语音识别框架语音基本操作使用scipy.io.wavfile读取wav音频文件获取采样率、长度、通道数使用numpy读取pcm格式音频文件读取wav音频文件,并绘制图像读取双声道的wav音频文件,分别绘制不同声道的波形图读取一个采样率为16k…

拍立淘API返回值:图像搜索技术的商品信息获取指南

拍立淘API是基于图像搜索技术的商品信息获取工具&#xff0c;广泛应用于阿里巴巴旗下的电商平台如淘宝、天猫等。这一API通过用户上传的商品图片&#xff0c;利用深度学习、计算机视觉等先进技术自动识别图片中的商品信息&#xff0c;并返回与之相关的搜索结果。以下是对拍立淘…