CAS操作

news2024/12/28 3:35:33

CAS

全称:Compare and swap,能够比较和交换某个寄存器中的值和内存中的值,看是否相等,如果相等,则把另外一个寄存器中的值和内存进行交换.

(这是一个伪代码,所以这里的&address实际上是想要表示取出address中的值)

那么我们可以看到,CAS就是这样一个简单的交换操作,那么我们为什么要在这里单独提出来呢?

原因是:这一段逻辑是通过一条CPU指令来完成的!(这就意味着,它是原子的)

这个对于编写线程安全的代码是非常重要的.我们为什么会有线程安全问题?归根结底是因为当前操作不是原子的.基于CAS又可以衍生出一套"无锁编程",但是CAS的使用范围具有一定的局限性.加锁的适用范围更广.

CAS的应用

实现原子类

比如,多线程针对一个count变量进行++操作,在Java标准库中,已经提供了一组原子类

//原子类的使用
public class Demo {
    public static AtomicInteger count =new AtomicInteger();
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(()->{
            for (int i=0;i<5000;i++){
                // count++;//注意,这里是一个对象,而不是一个变量,所以不能直接使用++;
                count.getAndIncrement();//相当于:count++;
                //count.incrementAndGet();//相当于:++count;
                //count.getAndDecrement();//相当于count--;
                //count.decrementAndGet();//相当于--count;
            }
        });
        Thread t2=new Thread(()->{
            for (int i = 0; i < 5000; i++) {
                count.getAndIncrement();
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(count.get());
    }
}

对于这个关键字,现在这个关键字说的已经不算了,到底要不要将这个数据放到寄存器当中,是由编译器来自主决定的.

为什么这两个CAS访问内存会有先后呢?多个CPU在操作同一个资源,也会涉及到锁竞争(指令级别的锁),指令级别的锁是比synchronized代码级别的锁要轻量很多的.

实现自旋锁

CAS的ABA问题

CAS的关键要点是比较寄存器1和内存的值,通过这里的值是否相等来判定内存的值是否发生了变化,如果内存的值变了,那么就存在其他线程对其进行了修改,如果内存的值没有变,那么就说明没有其他线程进行修改,接下来进行的修改就是安全的.

如果这里的值没有变,就一定没有别的线程进行修改吗?

A-B-A

另一个线程,把变量的值从A->B,又从B->A.此时本线程就区分不了,这个值是始终没变还是出现变化有变回来了的这种情况.大部分情况下,就算出现ABA问题也没事.

在面对ABA问题,CAS的基本思路是正确的,但是主要是修改操作能够进行反复横跳,就容易让咱们CAS的判定失效.CAS判定的是"值相同",实际上期望的是"值没有变化过"如果约定,值只能单向变化,那不就可以判断了吗?有的时候我们的数据不允许只增加不减少,此时我们只需要在增加一个变量来专门记录修改的次数就可以了.

CAS也是属于多线程开发中的一种典型的思路,在实际开发中,一般不会直接使用CAS,都是用库里已经基于CAS封装好的组件(就像原子类这种)

native

见到native关键字,就要明白这个方法是在JVM内部通过C++代码实现的了

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

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

相关文章

为什么网上商店需要翻译成其他语言

网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台&#xff0c;为来自世界各地的用户提供购买所需物品的机会。但是&#xff0c;为了让这些用户舒适地使用网站&#xff0c;需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…

app单页下载页源码带管理后台

新版带后台管理APP应用下载页,自动识别安卓苹果下载页&#xff0c;带管理后台&#xff0c;内置带3套App下载模板带中文模板/英文模板随时切换。 app单页下载页源码带管理后台

从头开始构建 RAG 的 LLM 代理:综合指南

GPT-3、GPT-4 等 LLM 及其开源版本经常难以检索最新信息&#xff0c;有时会产生幻觉或不正确的信息。 检索增强生成 (RAG)是一种将 LLM 的强大功能与外部知识检索相结合的技术。RAG 使我们能够将 LLM 响应建立在事实、最新的信息之上&#xff0c;从而显著提高 AI 生成内容的准…

java基础:流程控制

一、用户交互Scanner &#xff08;一&#xff09;基础 1、概念&#xff1a;基本语法中我们并没有实现程序和人的交互&#xff0c;但是Java给我们提供了这样一个工具类&#xff0c;我们可以获取用户的输入。java.util.Scanner 是 Java5的新特征&#xff0c;我们可以通过Scanne…

MySQL安装与环境配置

1.打开安装程序 2.默认配置&#xff0c;如下二三图 3.配置密码 4.等待安装完毕 5.检查 6.配置环境变量 7.从控制台登录检测

Let‘s Encrypt 申请免费 SSL 证书(每隔60天自动更新证书)

文章目录 官网文档简介安装 Nginxacme.sh生成证书智能化生成证书 安装证书查看已安装证书更新证书 官网 https://letsencrypt.org/zh-cn/ 文档 https://letsencrypt.org/zh-cn/docs/ 简介 Let’s Encrypt 是一个非营利组织提供的免费SSL/TLS证书颁发机构&#xff0c;旨在促…

Vue2和Vue3的区别Vue3的组合式API

一、Vue2和Vue3的区别 1、创建方式的不同&#xff1a; &#xff08;1&#xff09;、vue2:是一个构造函数&#xff0c;通过该构造函数创建一个Vue实例 new Vue({})&#xff08;2&#xff09;、Vue3:是一个对象。并通过该对象的createApp()方法&#xff0c;创建一个vue实例。 Vue…

X86 +PC104+支持WinCE5.0,WinCE6.0,DOS,Win2000,WinXP, Linux,QNX等操作系统,工业控制板卡定制

Celeron N2807 PC104模块 规格产品类型PC/104 主板芯片组SOCCPUIntel Celeron N2807 1.58 GHz内存板载2GB DDR3L双通道内存BIOSAMI 显示 L V D S 18/24-bit&#xff0c;VGA L V D S 支持最大分辨率为 1366768&#xff0c;VGA 支持最大分辨率为20481024 支持双独立显示存储 1Min…

软考《信息系统运行管理员》-2.3信息系统运维的外包

2.3信息系统运维的外包 信息系统运维外包的概念/模式 也称为信息系统代维。是指信息系统使用单位将全部或一部分的信息系统维护服务工作&#xff0c;按照规定的维护服务要求&#xff0c;外包委托给专业公司管理。 完全外包运维模式部分外包模式 信息系统运维外包的好处 有利…

告别PS修图,设计师都在用的AI抠图工具

引言 大家好&#xff01;如果你是美工或设计师&#xff0c;肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具&#xff0c;让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具&#xff0c;还能通过先进的AI技术&#xff0c;让抠图变得简单快速&#xff0c;让你专…

向量数据库:faiss的常用三种数据索引方式(IndexFlatL2,IndexIVFFlat,IndexIVFPQ)的使用和持久化+索引融合的实现及库函数解读

常用的三种索引方式 Faiss 中有常用的三种索引方式&#xff1a;IndexFlatL2、IndexIVFFlat 和 IndexIVFPQ。 1.IndexFlatL2 - 暴力检索L2&#xff1a; 使用欧氏距离&#xff08;L2&#xff09;进行精确检索。适用于较小规模的数据集&#xff0c;采用暴力检索的方式&#xff0…

基于YOLOv5的人脸关键点检测(附代码)

人脸关键点检测项目说明 本项目的实现主要依靠两个算法&#xff1a;yolov5目标检测和resnet人脸关键点算法。 其中目标检测算法为人脸关键点检测算法的前置算法&#xff0c;使用目标检测算法将人脸信息进行提取(起到前景与背景的分离)&#xff0c;然后再对box内的人脸信息进行…

AI人才争夺战:巨头眼中的产品经理必备技能

前言 在人工智能的浪潮下&#xff0c;BAT等一线互联网企业纷纷加码布局&#xff0c;对AI领域的人才需求空前高涨。然而&#xff0c;要在众多求职者中脱颖而出&#xff0c;成为企业眼中的人才&#xff0c;不仅需要深厚的产品功底&#xff0c;更要具备对AI的深刻理解和应用能力。…

【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(2)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

8625 火车上的无奈

这个问题可以通过计数来解决。对于每个case&#xff0c;我们可以计算出F和M的数量。如果F和M的数量相等&#xff0c;那么就可以形成一个环&#xff0c;否则就不能。 以下是一个C的解决方案&#xff1a; #include <iostream> #include <string>using namespace st…

SQL语句(DML)

DML英文全称是Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改等操作 DML-添加数据 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…

Nginx详解-安装配置等

目录 一、引言 1.1 代理问题 1.2 负载均衡问题 1.3 资源优化 1.4 Nginx处理 二、Nginx概述 三、Nginx的安装 3.1 安装Nginx 3.2 Nginx的配置文件 四、Nginx的反向代理【重点】 4.1 正向代理和反向代理介绍 4.2 基于Nginx实现反向代理 4.3 关于Nginx的location路径…

Qt时间日期处理与定时器使用总结

一、日期时间数据 1.QTime 用于存储和操作时间数据的类&#xff0c;其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下&#xff1a; //注&#xff1a;秒(s)和毫秒(ms)有默认值0 QTime::QTime(int h, int m, int s 0, int ms 0) 若无须初始化时间数据&#xff0c;可…

【新奇E100-开发记录】

新奇E100-开发记录 ■ 环境■ 编译器■ Ubuntu主机环境需要安装如下工具■ mips32R1工具链&#xff08;toolchain &#xff09;■ defconfig■ dts的选择■ 全局编译■■ ■ 环境 ■ 编译器 ■ Ubuntu主机环境需要安装如下工具 shell $ sudo apt install git $ sudo apt ins…

Protocol Buffers语言特性 (proto 3)

定义消息类型 首先让我们看一个非常简单的例子。假设您想要定义一个搜索请求消息格式&#xff0c;其中每个搜索请求都有一个查询字符串、您感兴趣的特定结果页面以及每个页面的多个结果。下面是用于定义消息类型的.proto文件。 syntax "proto3";message SearchRequ…