【JUC】12-CAS

ops/2024/9/20 2:07:53/ 标签: java, android, 开发语言

1. CAS

compare and swap,比较并交换。

包含三个操作数:内存位置、预期原值及更新值。

执行CAS操作的时候,将内存位置的值与预期原值比较:

  • 匹配,更新为新值。
  • 不匹配,不进行操作,多个线程同时执行CAS操作只有一个会成功。

CAS是JDK提供的非阻塞原子性操作,通过硬件保证比较-更新的原子性。底层实现为CPU指令cmpxchg,效率更高。通过unsafe类实现。

2. 自旋

线程修改失败重试的过程叫自旋。

java">public static void main(String[] args) {AtomicInteger integer = new AtomicInteger(5);System.out.println(integer.compareAndSet(51, 200) + " " + integer.get());}

在这里插入图片描述
自旋的实现代码
在这里插入图片描述
自己实现一个CAS。

java">public class SingletonLock {AtomicReference<Thread> atomicThread = new AtomicReference<>();public void Lock() {Thread thread = Thread.currentThread();System.out.println(thread.getName() + "Lock");// 当前不为空, 需要进行自旋while (!atomicThread.compareAndSet(null, thread)) {}}public void unLock() {Thread thread = Thread.currentThread();System.out.println(thread.getName() + "unLock");atomicThread.compareAndSet(thread, null);}public static void main(String[] args) {SingletonLock singletonLock = new SingletonLock();new Thread(()->{singletonLock.Lock();try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {throw new RuntimeException(e);}singletonLock.unLock();}, "t1").start();try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {throw new RuntimeException(e);}new Thread(()->{singletonLock.Lock();singletonLock.unLock();}, "t2").start();}
}

3. AtomicReference包装类

java">class Stu {String name;Integer age;public Stu(String name, Integer age) {this.name = name;this.age = age;}@Overridepublic String toString() {return name + ": " + age;}
}public class demo03 {public static void main(String[] args) {Stu zs = new Stu("zs", 18);Stu ls = new Stu("ls", 29);AtomicReference<Stu> atomicReference = new AtomicReference<>();atomicReference.set(zs);System.out.println(atomicReference.compareAndSet(zs, ls) + " " + atomicReference.get().toString());}
}

4. CAS缺点

4.1 循环时间长,开销大

4.2 ABA问题

解决方案:版本号,戳记流水。
在这里插入图片描述

java">class Stus {Integer id;String name;public Stus(Integer id, String name) {this.id = id;this.name = name;}public String getName() {return name;}
}
public class demo04 {public static void main(String[] args) {Stus zs = new Stus(1, "zs");Stus ls = new Stus(2, "ls");AtomicStampedReference<Stus> atomicStampedReference = new AtomicStampedReference<>(zs, 1);atomicStampedReference.compareAndSet(zs, ls, atomicStampedReference.getStamp(), 2);System.out.println(atomicStampedReference.getReference().getName());atomicStampedReference.compareAndSet(ls,zs, atomicStampedReference.getStamp(), 3);System.out.println(atomicStampedReference.getReference().getName());}
}

http://www.ppmy.cn/ops/105862.html

相关文章

uniapp获取地理位置的API是什么?

在uni-app中&#xff0c;获取地理位置的API是uni.getLocation。这个API的主要作用是获取用户的当前地理位置信息&#xff0c;包括经纬度、速度、高度等。以下是对uni.getLocation API的详细说明&#xff1a; 使用方法 在uni-app中&#xff0c;你可以通过调用uni.getLocation方…

输电线路分布式故障诊断系统:分布式智慧网络的构建

输电线路分布式故障诊断系统&#xff1a;分布式智慧网络的构建 今天&#xff0c;就让深圳鼎信智慧科技陪大家一起走进输电线路分布式故障定位系统的世界&#xff1a; 1、系统架构&#xff1a;分布式智慧网络的构建 输电线路分布式故障定位系统主要由三大核心部分组成&#x…

IO进程day04(进程)

目录 进程 1》什么是进程 1> 概念 2> 特点 3> 进程段 4> 进程分类 5> 进程状态 6> 进程状态切换图 7> 进程相关命令 <补充>优先级调度 2》进程函数接口 1> 创建进程 fork() 2> 回收资源 3> 结束进程 4> 获取进程号 3》exe…

深入解析:Nginx 负载均衡中的请求日志配置与优化

在Nginx负载均衡的配置中&#xff0c;请求日志的记录是一个关键环节&#xff0c;它不仅帮助我们监控流量模式&#xff0c;还能在出现问题时提供调试信息。本文将详细介绍如何在Nginx中配置请求日志&#xff0c;包括日志格式的自定义、日志文件的管理以及日志的优化策略。 1. N…

在Ubuntu上使用apt工具安装RabbitMQ

创建安装脚本 cd home/ madir scripts cd scripts 创建脚本前&#xff0c;需要确认Linux版本。不同的版本对应着不同的运行脚本。 lsb_release -a 查看Linux版本 可以看到&#xff0c;我的Ubuntu版本是22.04。 在这里找到对应的脚本复制。 创建脚本文件&#xff1a; ca…

自己开发完整项目一、登录功能-03(使用springSecurity安全框架,查询用户角色权限)

一、说明 在前面两章节&#xff0c;实现了通过springsecurity来进行用的登录认证&#xff0c;当用户输入用户名和密码之后&#xff0c;通过额数据库中的信息比对&#xff0c;比对成功那么放行。但是还存在一个问题&#xff1a;因为系统的所有页面包括按钮都是有各自的权限&…

python 执行mysql文件

MySQL 5.7 之前的版本在某些方面对存储过程的支持可能有限&#xff0c;通过 Python 脚本调用 SQL 文件是一种有效的方法来自动化数据库任务和提高运维效率。具体操作如下&#xff1a; # python 执行sql脚本 def execute_sql_script(mysql_params, script_name):# 使用 with 语…

Docker Elasticsearch安装ik分词插件教程

本章教程在通过Docker 安装Elasticsearch,并安装ik分词插件。本文的重点是安装ik分词插件。 一、安装Elasticsearch 安装教程以前写过,参考:https://blog.csdn.net/qq_19309473/article/details/140725121 安装之后,通过http://ip:9200,可以访问,就表示安装成功。 二、安装…

MATLAB生成COE文件

MATLAB代码 % 参数设置 N 4096; % 数据点数量 t linspace(0, 2*pi, N); % 时间向量 width 12; % 位宽% 正弦波&#xff0c;幅度在0到5之间 sine_wave 2.5 * sin(t) 2.5;% 三角波&#xff0c;幅度在0到5之间 tri_wave 5 * (1 - abs(mod(t/(2*pi)*4, 2) - 1));% 方波&…

sealos快速搭建k8s集群

一&#xff0c;环境准备 1&#xff0c;三台&#xff08;搭建一主两从集群&#xff09;或五台&#xff08;三主两从集群&#xff09;虚拟机&#xff0c; 安装alimaLinux系统 &#xff0c;相同的root密码&#xff0c;不要安装docker。 如果是alimaLinux-mini版本操作系统&#xf…

zyx青岛实训day34 初步了解Docker与套接字的应用

回顾 1、主从复制&#xff08;高可用&#xff09; 2、传统的主从复制 3、gtids事务型的主从复制 4、注意 1&#xff09;server_id唯一 2&#xff09;8.X版本需要get_ssl_pub_key 3&#xff09;5.X不需要 4&#xff09;change master to 5&#xff09;stop | start slave 5…

18.求三数之和

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;双指针&#xff09; 这道题目与上一道题&#xff0c;求有效三角形的个数&#xff0c;十分类似&#xff0c;都是使用双指针算法来解决问题。 先进行排序&#xff0c;然后利用单调性进行调整&#xff0c;逐步逼近正确…

《OpenCV计算机视觉》—— 对图片的各种操作

文章目录 1、安装OpenCV库2、读取、显示、查看图片3、对图片进行切割4、改变图像的大小5、图片打码6、图片组合7、图像运算8、图像加权运算 1、安装OpenCV库 使用pip是最简单、最快捷的安装方式 pip install opencv-python3.4.2还需要安装一个包含了其他一些图像处理算法函数的…

解决firewalld启动状态下docker无法启动

环境&#xff1a;centos 7 docker安装方式&#xff1a;二进制文件安装&#xff0c;点击跳转安装方法链接 docker版本&#xff1a;27.2.2 问题描述&#xff1a;按照原来的二进制安装部署方式&#xff0c;到了最后一步&#xff1a; systemctl start docker 发现一直卡住不动&…

【Arm Cortex-X925】 -【第二章】-Cortex-X925 core简介

2. Cortex-X925 核心 Cortex-X925 核心是一款高性能、低功耗的产品,采用了 Armv9.2-A 架构。Armv9.2-A 架构在 Armv8‑A 架构的基础上进行了扩展,涵盖了 Armv8.7‑A。 Cortex-X925 核心集成在 DSU-120 DynamIQ™ 集群内。它连接到 DynamIQ™ Shared Unit-120,该单元作为一…

大数据技术之Flume 数据流监控——Ganglia 的安装与部署(11)

目录 Flume 数据流监控 Ganglia 的安装与部署 Ganglia 组件介绍 1&#xff09;安装 Ganglia 2&#xff09;在 hadoop12 修改配置文件 /etc/httpd/conf.d/ganglia.conf 3&#xff09;在 hadoop12 修改配置文件 /etc/ganglia/gmetad.conf 4&#xff09;在 hadoop12, hadoo…

酒店管理系统小程序(包含源码C++实现)

本文实现一个酒店管理系统小程序&#xff0c;涉及多个方面&#xff0c;包括用户接口、房间管理、预订系统、用户管理等。为了保持示例的简洁性&#xff0c;下面的实现将包括一个简单的控制台程序&#xff0c;演示基本的酒店管理功能。这将涵盖以下功能&#xff1a; 查看房间状…

设置Virtualbox虚拟机共享文件夹

由于工作环境的原因&#xff0c;选择Virtualbox的方式安装虚拟操作系统&#xff0c;常用的操作系统为ubuntu&#xff0c;不知道道友是否也曾遇到这样的问题&#xff0c;就是虚拟机和主机进行文件拖拽的时候&#xff0c;会因为手抖造成拖拽失败&#xff0c;虚拟机界面显示大个的…

JAVAEE初阶第一节——计算机的工作原理

系列文章目录 JAVAEE初阶第一节——计算机的工作原理 计算机的工作原理 计算机发展史冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09;CPU操作系统&#xff08;Operating System&#xff09; 文章目录 系列文章目录JAVAEE初阶第一节——计算机的工作原理 计算机…

在.gitignore文件中重新添加或修改了忽略文件未生效的原因

因为git在初始化时就已经对忽略文件进行了不追踪&#xff0c;其它文件都会追踪&#xff0c;重新添加忽略文件后&#xff0c;实际上是没有进行更改追踪记录的&#xff0c;所以需要重新初始化。 git rm -r --cached .git add .git commit -m "Update .gitignore"