CAS 你知道吗?CAS 底层原理?谈谈对 UnSafe 的理解?

news/2024/9/23 7:58:01/

什么是CAS?以及CAS的底层原理

CAS(Compare and Swap) 是JUC中的并发编程中常用的原子操作,它用于实现多线程环境下的无锁同步,CAS操作包含三个操作数 : 内存位置(或称为变量的地址)、期望值和新值。

CAS的执行过程如下:

  1. 读取内存位置的当前值,也就是我们的期望值。
  2. 比较期望值与内存位置的当前值是否相等。
  3. 如果相等,将新值写入内存位置;如果不相等,则说明其他线程已经修改了内存位置的值,CAS操作失败。
  4. CAS操作返回当前内存位置的值。

CAS的操作是原子性的,能够保证在多线程环境下对共享变量的原子性操作,如果CAS操作失败,通常会进行重试,直到成功为止。

java">public class CASDemo {public static void main(String[] args) {AtomicInteger atomicInteger = new AtomicInteger(666);// 获取真实值,并替换为相应的值boolean b = atomicInteger.compareAndSet(666, 2019);System.out.println(b); // trueboolean b1 = atomicInteger.compareAndSet(666, 2020);System.out.println(b1); // falseatomicInteger.getAndIncrement();}
}

Unsafe类

Unsafe 是 CAS 的核心类,由于 Java 方法无法直接访问底层系统,而需要通过本地(native)方法来访问, Unsafe 类相当一个后门,基于该类可以直接操作特定内存的数据。Unsafe 类存在于 sun.misc 包中,其内部方法操作可以像 C 指针一样直接操作内存,因为 Java 中 CAS 操作执行依赖于 Unsafe 类。

CAS 并发原体现在 JAVA 语言中就是 sun.misc.Unsafe 类中的各个方法。调用 UnSafe 类中的 CAS 方法,JVM 会帮我们实现出 CAS 汇编指令。这是一种完全依赖硬件的功能,通过它实现了原子操作。

由于 CAS 是一种系统源语,源语属于操作系统用语范畴,是由若干条指令组成,用于完成某一个功能的过程,并且原语的执行必须是连续的,在执行的过程中不允许被中断,也就是说 CAS 是一条原子指令,不会造成所谓的数据不一致的问题。它允许Java程序直接访问和修改内存、执行CAS操作等底层操作,但是它的使用需要谨慎,因为它绕过了Java语言的一些安全检查和限制。

Unsafe类的使用需要具有高度的专业知识和经验,因为它可以导致一些潜在的安全问题和内存错误。因此,一般情况下,不建议直接使用Unsafe类,而是通过高级的并发工具和原子类来实现线程安全的操作。

CAS的缺点

  • 循环时间长开销很大
    • 如果 CAS 失败,会一直尝试,如果 CAS 长时间一直不成功,可能会给 CPU 带来很大的开销(比如线程数很多,每次比较都是失败,就会一直循环),所以希望是线程数比较小的场景。
  • 只能保证一个共享变量的原子操作
    • 对于多个共享变量操作时,循环 CAS 就无法保证操作的原子性。
  • 引出 ABA 问题

http://www.ppmy.cn/news/1444592.html

相关文章

Java面试八股之Java中==和equals()的区别

Java中和equals()的区别 操作符: 对于基本数据类型(如int、char、boolean等),比较的是它们的值是否相等。 对于对象引用类型,比较的是两个对象的内存地址(即是否指向同一个对象实例)。也就是…

day84 json中实现简单验证码

项目中的问题: 1 修改JS或CSS后,页面不能及时更新? 把浏览器-->"开发者工具"-->"网络"-->选中"禁用缓存" 2 如何把HTML页面转为JSP页面 将jsp页面中的<% page contentType"text/html;charse…

07_for循环返回值while循环

文章目录 1.循环返回值2.yield接收for返回值3.scala调用yield方法创建线程对象4.scala中的while循环5.scala中的流程控制 1.循环返回值 for循环返回值是Unit 原因是防止产生歧义&#xff1b; 2.yield接收for返回值 // 2.yield关键字打破循环&#xff0c;可以使for循环输出…

WEB攻防-PHP特性-metinfoCMS审计实例

前置知识&#xff1a;PHP函数缺陷 测试环境&#xff1a;MetInfo CMS 函数缺陷导致的任意文件读取 漏洞URL&#xff1a;/include/thumb.php?dir 漏洞文件位置&#xff1a;MetInfo6.0.0\app\system\include\module\old_thumb.class.php <?phpdefined(IN_MET) or exit(No…

Qt Designer入门

安装 PyQt5提供了一个可视化图形工具Qt Designer&#xff0c;文件名为designer.exe。如果在电脑上找不到&#xff0c;可以用如下命令进行安装&#xff1a; pip install PyQt5-tools 安装完毕后&#xff0c;可在如下目录找到此工具软件&#xff1a; D:\Python3.9\Lib\site-pa…

Go源码--Strconv库

简介 Strconv 库是一些跨类型的转换函数集合&#xff0c;大家应该很熟悉。源码没有什么难点&#xff0c;主要是面试题有可能会出这种类型的&#xff0c;所以简单介绍下&#xff0c;主要介绍 以下两种常用转换&#xff0c;其他的没细研究&#xff0c;感兴趣的可以看看。 Strco…

Baidu comate智能编程助手评测

Baidu comate智能编程助手评测 作者&#xff1a;知孤云出岫 目录 一&#xff0e; 关于comate产品 二&#xff0e; 关于comate产品体验 三&#xff0e; 关于实际案例. 四&#xff0e; 关于baidu comate编程助手的实测体验感悟 五&#xff0e; …

StatusBar,状态栏设置中文

在Qt的ui中&#xff0c; 菜单栏–View–Property Editor–statusBarVisible–勾选– 在C代码中&#xff0c; sloem1.h private://任意写一个函数void onStatusBarShow();sloem1.cpp void sloem1::onStatusBarShow() {QString strLabel;//显示文字来源this->setTextResour…