java CAS

CAS
  • 在高并发场景,可以使用加锁 或者CAS来保证原子性,但是加锁是很重量级的操作,CAS类似于乐观锁
  • CAS ( Compare and swap )比较并交换,是实现并发算法时常用到的技术,包含三个操作数:内存位置、预期原值、更新值
  • 执行CAS操作的时候,将内存位置中的值与预期原值比较
    • 如果匹配,会将该位置的值更新为新值,
    • 如果不匹配就不会做任何操作,或者重试,这种重试被称为自旋,多个线程同时执行CAS操作,只有一个会成功
  • CAS 是JDK提供的非阻塞原子操作,通过硬件保证了比较-更新的原子性
  • CAS 是一种系统原语,原语属于操作系统用于范畴,由若干条指令组成,用于完成某个功能,原语的执行必须是连续的,在执行过程中不允许被中断,所以说CAS是一条CPU的原子指令,不会造成数据不一致的问题
  • JDK提供的CAS机制,在汇编层级会禁止变量两侧的指令优化,然后使用 cmpxchg(比较并交换) 指令比较并更新变量值
  • 执行 cmpxchg 指令的时候,会判断当前系统是否为多核系统,
    • 如果是就给总线加锁,只有一个线程可以对总线加锁成功,加锁成功后执行CAS操作
    • 所以CAS的原子性实际上是CPU实现独占的,比起synchronized,CAS的排他时间要短很多,多线程情况下性能会更好
Unsafe类:
  • Unsafe类是CAS的核心类,由于java无法直接访问底层,需要通过本地的 native 方法来访问,
  • Unsafe想当与一个后门,基于该类可以直接操作特定内存的数据,内部的操作可以向C的指针一样直接操作内存,该类的方法基本都是native的,可以直接调用操作系统底层资源执行任务
  • 但是实际工作中不要自己去使用 Unsafe类,容易导致内存混乱
  • 如下,三个类似的方法,以第一个为例,参数分别为:
    • var1 是操作的对象
    • var2 是操作对象中属性地址的偏移量
    • var4 期望的值
    • var5 要修改的新值
  • 核心思想就是比较内存中的值与预期原值进行比较,相等就更新为新值,例如:
    • A、B两个线程都想要变更共享变量的值,各自都先读到主内存中的原值
    • A执行较快,先完成计算,写回时判断主内存中的值和原值一样,就把计算得到的新值写回
    • 这时B也执行完了,写回时判断主内存中的值和原值不一样,就放弃本次操作,这里可以加上自旋让B重新执行一次,这样在多线程情况下,两次计算结果就都不会丢失了

在这里插入图片描述

CAS自旋锁
  • CAS利用CPU的指令保证了操作的原子性,达到锁的效果
  • 自旋锁也就是获取锁失败的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,直到成功获取锁,或者超时,放在CAS就是执行一个CAS操作,不断的去执行CAS操作,直到CAS操作被成功执行
  • 这样的好处是减少了线程上下文的切换,缺点是循环会消耗CPU

示例:不通过 synchronized 和 lock ,就实现了锁的功能,自己实现自旋锁

public class Caslock {//是否加锁,初始值为 false,也就是未加锁private AtomicBoolean atomicBoolean =new AtomicBoolean(false);public void lock(){System.out.println(Thread.currentThread().getName()+",尝试加锁");//原子布尔的值是否是false,是就加锁,把值改为true,不是就释放锁while (!atomicBoolean.compareAndSet(false,true)){//不是false,加锁失败,由其他线程先加了锁,这里就需要等待try {Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}System.out.println(Thread.currentThread().getName()+",加锁成功");}public void unLock(){//解锁,把值设为 falseatomicBoolean.compareAndSet(true,false);System.out.println(Thread.currentThread().getName()+",释放锁");}
}private static void testCasLock() throws Exception{Caslock caslock = new Caslock();new Thread(()->{caslock.lock();try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}caslock.unLock();},"线程A").start();Thread.sleep(500);new Thread(()->{caslock.lock();caslock.unLock();},"线程B").start();}

CAS的缺点

  • 循环时间太长的话,开销会很大

  • ABA问题

    • 例如A、B 两个线程,都拿到相同的初始值,A把值加1后写回,然后减1后又写回
    • 此时B才执行完,尽管线程B的CAS操作成功,但是这样丢失了A的两次操作,所以仅仅只比较内容,是线程不安全的

想要解决ABA问题,需要加上版本号或者时间戳

  • AtomicStampedReference:流水号的戳记引用

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux编译器

目录 Linux编译器 程序编译的步骤 gcc编译器完成C语言程序的编译 预处理 编译 汇编 链接 上一期我们学习了Linux中的vim编辑器,其实本质上vim编辑器就是写代码的一个工具。上期内容我们也已经说过,一份合格的代码需要进行编写,编译&am…

4.4 媒资管理模块 - 分布式任务处理介绍、视频处理技术方案

媒资管理模块 - 视频处理 文章目录 媒资管理模块 - 视频处理一、视频转码1.1 视频转码介绍1.2 FFmpeg 基本使用1.2.1 下载安装配置1.2.2 转码测试 1.3 工具类1.3.1 VideoUtil1.3.2 Mp4VideoUtil1.3.3 测试工具类 二、分布式任务处理2.1 分布式任务调度2.2 XXL-JOB 配置执行器 中…

TopAccess验证东芝刷卡打印机苹果电脑连接教程(适用于intel和苹果m芯片)

复制打印机IP地址到谷歌浏览器后回车,默认用户名:admin,密码:123456,点击登录按钮。如果有更改的请按照实际输入。 依次点击用户管理-用户账户-新建。如果需要新建部门的,可以点击用户管理-部门管理-新建。…

今天才知道原来它是这样的HTTP

HTTP介绍 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文…

JPEG格式详解Baseline、Progressive的区别

文章目录 JPEG的简介压缩质量/压缩比率色彩空间基线和渐进子采样存储选项 基线和渐进基线格式渐进格式: 子采样4:4:4(无损)4:2:24:2:0 JPEG的简介 JPEG(Joint Photographic Experts Group)是一种常见的图像压缩格式&a…

有些应用中不需要使用回原点指令

不是所有的轴运动控制,都一定要使用回原点指令来执行回原点 通过手动找到极限开关,然后往回走一段距离,也是一种方式,所谓的往回走的这段距离方便用于手动校准原点位置; 那使用原点指令回原点后,也可以走一…

【大厂算法面试冲刺班】day0:数据范围反推时间复杂度

常见算法的时间复杂度 规定n是数组的长度/树或图的节点数 二分查找:O(logn) 双指针/滑动窗口:O(n) DFS/BFS:O(n) 构建前缀和:O(n) 查找前缀和:O(1) 一维动态规划:O(n) 二维动态规划:O(n^2) 回溯…

Go采集1688网站数据对比商品价格

最近看了下多多和1688的一些商品价格,发现好多店铺都是无货源拿货一件发货,这就导致层层叠加价格翻了不知道几倍,真所谓多花钱办的事还是一样,因此,今天我就通过一个爬虫程序监控对应商品价格,了解行业龙头…

MCU、MPU、SOC简介

文章目录 前言一、MCU二、MPU三、SOC总结 前言 随着处理器技术的不断发展,CPU(Central Processing Unit)的发展逐渐出现三种分支,分别是MCU(Micro Controller Unit,微控制器单元) 和MPU(Micro Processor Unit,微处理器…

Java web设计:在线微友圈网站

项目背景 微友圈是一个基于Java Web开发的社交网络平台,旨在为用户提供一个轻松互动、分享生活和交流观点的在线社区。随着社交网络的普及,人们更加渴望与朋友、家人以及其他志同道合的人保持联系并分享彼此的生活点滴。微友圈的目标是打造一个简洁、高…

什么情况?DDD 中的每个任务都执行了两次?

最近在使用 COLA 框架自带的异步任务时,发现每次执行异步都执行了两次,如果一些没有做幂等的接口,这样是会有问题的,比如入库操作之类的,就会造成数据重复入库,造成严重 bug。 带着疑惑,开始了…

小巧且兼具高性能的小模型 TinyLlama 等

TinyLlama-1.1B 小模型在边缘设备上有着广泛的应用,如智能手机、物联网设备和嵌入式系统,这些边缘设备通常具有有限的计算能力和存储空间,它们无法有效地运行大型语言模型。因此,深入探究小型模型显得尤为重要。 来自新加坡科技…