[编程思想录]无锁之CAS

一、背景

解决线程并发产生的问题,除了锁,volatile等关键字之外,在特定的情景下为了提高代码运行的效率,为了摆脱“锁”这个独占式的编程方式之外,还有另外一个原子类的概念。
在java.util.concurrent.atomic包下有Java提供的线程安全的原子类,比如AtomicInteger。而这些原子类就用到了CAS机制,下面我们就来了解一下 CAS机制

二、CAS原理

原子类 线程安全 非阻塞,底层没有锁,底层实现原理为CAS无锁技术,就是比较再交换:compare and swap
CAS包含三个参数(V,E,N)V表示要更新的变量,E表示预期值,N表示新值。
● V=需要去更新的变量(主内存的共享变量)
● E=预期值(本地内存的副本)
● N=新值
仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。
如果V=E(主内存的值与本地内存的值一致,说明没人修改),将V的值设置为N。
如果V不等于E(主内存的值跟本地内存的不一致),已经被修改。这样的情况下,就将E的值设置成V的值,重新刷新,再比较。看下源码,无非就是一个无限刷新,知道V和E的值一致。
在原子类中大量使用到CAS。

三、CAS运用案例

1. AtomicInteger的实现

要想实现这种自赠的效果就需要加锁,为了提高效率,这种场景下原子类型就可以胜任。

AtomicInteger ai =new AtomicInteger(1);
ai.incrementAndGet();

查看实现代码:

 /*** Atomically increments by one the current value.** @return the updated value*/public final int incrementAndGet() {return U.ge

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

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

相关文章

list中符合 多条件中筛选符合条件的值

//查找身高在1.8米及以上的男生 // List<SsxlwdBean> boys list.stream().filter(s->s.getGender() && s.getHeight() > 1.8).collect(Collectors.toList()); xlseachitem list.stream().filter(list->list.xlname.contains(Upstrquery)||list.xlbm.…

AGI之MFM:《多模态基础模型:从专家到通用助手》翻译与解读之视觉理解、视觉生成

​AGI之MFM&#xff1a;《Multimodal Foundation Models: From Specialists to General-Purpose Assistants多模态基础模型&#xff1a;从专家到通用助手》翻译与解读之视觉理解、视觉生成 目录 相关文章 AGI之MFM&#xff1a;《Multimodal Foundation Models: From Speciali…

【Docker内容大集合】Docker从认识到实践再到底层原理大汇总

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/categ…

硬盘损坏不能用怎么办?

硬盘是电脑的核心&#xff0c;如果硬盘出现了问题&#xff0c;那么整台电脑都会受到影响&#xff0c;电脑中的数据也会丢失。那么面对硬盘损坏时我们该如何解决呢&#xff1f;本文今天用5种简单的方法帮您解决&#xff01; 1、硬盘连接是否松动 当电脑的硬盘突然表现出无法识别…

代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结

代码随想录训练营二刷第四十八天 | 139.单词拆分 背包问题总结 一、139.单词拆分 题目链接&#xff1a;https://leetcode.cn/problems/word-break/ 思路&#xff1a;单词拼字符串&#xff0c;完全背包。定义dp[i]&#xff0c;为true表示可以拆分为一或多个单词。可能会出现ab…

Python学习之——测试环境路径的工程示例

Python学习之——测试环境路径的工程示例 Python环境路径几点小结一个工程示例 Python环境路径 参考&#xff1a; Python模块导入与路径管理 1.对于一个纯Python工程, 在 import模块时&#xff0c;Python解释器的搜索顺序是先搜索built-in模块&#xff0c;然后搜索 sys.path这…

Python标准库中内置装饰器@staticmethod@classmethod

装饰器是Python中强大而灵活的功能&#xff0c;用于修改或增强函数或方法的行为。装饰器本质上是一个函数&#xff0c;它接受另一个函数作为参数&#xff0c;并返回一个新的函数&#xff0c;通常用于在不修改原始函数代码的情况下添加额外的功能或行为。这种技术称为元编程&…

stm32之手动创建keil工程--HAL库

用CubeMx创建了好多stm32的工程&#xff0c;这里记录下手动创建keil工程的过程。 一、准备工作 1.1、下载对应的HAL库&#xff0c; 这里使用的是stm32f103c8t6, 下载地址stm32HAL库 在页面中输入对应型号点击进行二级页面进行下载 1.2、准备工程 各文件夹下具体操作如下&am…

破译滑块验证间距 破译sf顺丰滑块验证

废话不多说直接开干&#xff01; from selenium import webdriver # 导入配置 from selenium.webdriver.chrome.options import Options import time from PIL import Image # 导入动作链 from selenium.webdriver.common.action_chains import ActionChains import random, st…

保研机试算法训练个人记录笔记(二)

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。&#xff08;来源力扣&#xff09; 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解释&#xff1a;最长…

雷达电子箔条干扰和雷达诱饵简介

一、JAMMING 利用箔条、角反射器和诱饵进行机械干扰。 1、箔条(Chaff) 箔条是一种雷达干扰,在这种干扰中,飞机或其他目标散布一团薄薄的铝、金属化玻璃纤维或塑料,它们要么作为一组主要目标出现在雷达屏幕上,要么以多次回击淹没屏幕。 图1 箔条 2、箔条的雷达散射截面…

linux系统中三个重要的结构体

第一​&#xff1a;struct inode结构体 struct inode { struct hlist_node i_hash; struct list_head i_list; /* backing dev IO list */ struct list_head i_sb_list;​ //主次设备号 dev_t i_rdev;​ struct list_head i_devices; //用联合体是因为该…

java的反射

Java反射&#xff08;Reflection&#xff09;是一种在运行时检查类、方法、字段等结构的能力&#xff0c;以及在运行时实例化对象、调用方法、访问和修改字段等的能力。反射使得程序可以在运行时获取类的信息&#xff0c;操作类的属性和方法&#xff0c;而不需要在编译时就确定…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果&#xff0c;话不多说&#xff0c;先来看看视频效果吧&#xff1a;链接 在这里具体的代码就不放出来了&#xff0c;还是利用了uniapp的 uni.createAnimation 方法&#xff0c;因为cover-view 不支持一些css 的动画效果&#xff0c;所以这…

ICON图标设计优漫动游

ICON承载了App大部分功能的引导入口&#xff0c;是交互设计中是相当重要的一环。 ICON图标设计   ICON有一种象征意义或隐喻性&#xff0c;并在日常生活中经常遇到。icon代表了一些行动、事、人、真实的、虚拟的视觉符号。   ICON不仅是图标这么简单&#xff0c;它承…

如何使用百度“云一朵”来分析PDF文件

PDF 文件是一种常见的文件格式&#xff0c;用于存储文档、图像和其他内容。在许多情况下&#xff0c;我们需要对 PDF 文件进行分析&#xff0c;以提取其中的信息。百度“云一朵”提供了一个 PDF 分析 API&#xff0c;可以帮助我们轻松地对 PDF 文件进行分析。 在本博客文章中&…

rust函数

一 、函数定义 &#xff08;一&#xff09;格式 使用fn关键字 fn是 function 的缩写 1.无返回值的 fn 函数名 ( [paraname: type]... ) {函数体 }参数必须声明参数名称和类型 函数定义时指定的参数叫做 形参。调用时传递给函数的参数叫做 实参。 例子 fn another_function(…

基于Java的企业人事管理系统设计与实现(源码+lw+ppt+部署文档+视频讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

进程互斥的软件实现方法,硬件实现方法以及互斥锁

1.进程互斥的软件实现方法 1.单标志法 1.算法思想: 两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。 也就是说每个进程进入临界区的权限只能被另一个进程赋予。 2.例子 因此&#xff0c;该算法可以实现“同一时刻最多只允许一个进程访问临界区”。 3.主要…

Polygon Mide状态模型:解决状态膨胀,而不牺牲隐私和去中心化

1. 引言 前序博客有&#xff1a; Polygon Miden&#xff1a;扩展以太坊功能集的ZK-optimized rollupPolygon Miden zkRollup中的UTXO账户混合状态模型Polygon Miden交易模型&#xff1a;Actor模式 ZKP &#xff1e; 并行 隐私 在Polygon Miden交易模型&#xff1a;Actor模…