JUC03-volatile、CAS及并发原子类

news2025/8/7 16:53:02

一、 Volatile

Volatile可以用来修饰成员变量和静态成员变量,保证可见性、有序性

可见性:保证volatile修饰的变量每次读取都会从主从中进行读取而不是cpu缓存
有序性:对Volatile修饰变量进行写操作时,会在该操作后加上写屏障,进行读操作时会在读操作前加上读屏障。

读写屏障

写屏障(sfence)保证在该屏障之前的,对共享变量的改动,都同步到主存当中,并且会确保指令重排序时,禁止屏障前后的写操作跨越屏障。

读屏障(lfence)保证在该屏障之后,对共享变量的读取,加载的是主存中最新数据。并且会确保指令重排序时,禁止屏障前后的读操作跨越屏障

二、CAS

cas是compareAndSet的缩写,底层使用cpu指令,是一个比较并赋值的原子操作

结合 CAS 和 volatile 可以实现无锁并发,适用于线程数少、多核 CPU 的场景下。

  • CAS 是基于乐观锁的思想:最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试呗。
  • synchronized 是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。

CAS 体现的是无锁并发、无阻塞并发,请仔细体会这两句话的意思
因为没有使用 synchronized,所以线程不会陷入阻塞,这是效率提升的因素之一
但如果竞争激烈,可以想到重试必然频繁发生,反而效率会受影响

相比于

三、 原子累加器LongAdder

与之前提到的AtomicInteger不同,LongAdder 累加器采取了效率更高的方法应对高并发情况对数据的累加需求

优化一:多个cell分摊并发压力

LongAdder 关键字段

// 累加单元数组, 懒惰初始化
transient volatile Cell[] cells;
// 基础值, 如果没有竞争, 则用 cas 累加这个域
transient volatile long base;
// 在 cells 创建或扩容时, 置为 1, 表示加锁
transient volatile int cellsBusy;

当执行add(x)操作时大概执行流程如下:

  1. 判断当前是否发生过竞争

    • 若没有则使用cas对base进行累加
  2. 若有则判断当前线程是否有对应cell

    • 有则使用cas对该cell进行累加
  3. 若没有或者对base的cas累加失败或者对cell的cas累加失败

  4. 创建新的cell进行累加(具体创建与否需要根据机器cpu的核心数量)

  5. 将所有cell的值进行求和返回

优化二:缓存行伪共享

不同CPU的寄存器中用到了不同的变量,一个用到的是X,一个用到的是Y,并且XY在同一个缓存行中,这就叫做缓存行伪共享

所谓缓存行就是cpu缓存的单位,每个缓存行大小为64个字节。当对缓存行中一个数据进行修改时,整个缓存行都将失效
在这里插入图片描述
LongAdder内部维护一个cells数组,包含多个cell(累加单元),每个cell绑定一或多个线程来分摊并发压力,然而,即使不同的cell对应不同的线程,但伪共享的出现会导致线程1对一个cell的修改导致另一个cell的值失效,需要重新从内存读取,大大影响其性能
在这里插入图片描述

@Contended注解填充缓存行解决伪共享

此注解可以填充被修饰的对象,使一个缓存行最多只能存储一个该对象,解决伪共享问题
在这里插入图片描述

总结

LongAdder通过使用多个cell分摊并发压力提高累加器性能,并且用@Contended注解修饰Cell对象,使其能够独占缓存行,解决了缓存行伪共享的问题。而AutomicInteger内部只用一个变量用来表示当前值,在高并发下多个线程争抢该变量性能损耗较大。

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

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

相关文章

【附源码】计算机毕业设计JAVA校园教育服务平台

【附源码】计算机毕业设计JAVA校园教育服务平台 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA my…

【FLASH存储器系列十】Nand Flash芯片使用指导之一

目录 1.1 芯片简介 1.2 功能框图 1.3 存储结构 1.4 信号定义 1.5 双平面(plane)操作 1.6 Die间交错操作 1.7 错误管理 今天以MT29F8G08AJADAWP芯片为例,说明nand flash的操作方法。 1.1 芯片简介 这是一款镁光的容量8Gb,总…

功能上新 | Magic Data Annotator智能出行舱内舱外全场景标注

随着人工智能、互联网、大数据、5G等新技术应用和汽车产业变革的蓬勃兴起,智能汽车已成为汽车产业发展的重要战略方向。目前,智能驾驶已经成为目前车企营销的核心竞争力。在人车协作过程中,智能汽车最重要的功能就是车舱内外视觉功能&#xf…

Redis入门

目录 NoSQL概述 什么是NoSQL? 为什么要用NoSQL? NoSQL 的特点 NoSQL的四大分类 Redis入门 概述 基础知识 五大数据类型 Redis——Key String(字符串) List(列表) Set(集合) Hash(哈希) Zset(有序集合) 三种特殊数据类型 Geospatial 地理…

冯诺依曼体系结构、操作系统的认识

目录前言1️⃣ 冯诺依曼体系结构1.1 基本概念1.2 存储器的作用1.3 CPU的指令集1.4 实例2️⃣ 操作系统2.1 概念2.2 如何理解“管理”2.2.1 管理的本质2.2.2 管理的方法2.3 系统调用总结前言 💭本文是对计算机底层学习的初步认识的知识铺垫,初步了解冯诺依…

高等数值计算方法学习笔记第4章第二部分【数值积分(数值微分)】

高等数值计算方法学习笔记第4章第二部分【数值积分(数值微分)】四、龙贝格求积公式(第三次课)1.梯形法的递推化 (变步长求积法)2.龙贝格算法五、高斯求积公式1.一般理论(1定义1例题)2.构造高斯求积公式方法(二&#xf…

0098 蓝桥杯真题01

import java.util.Calendar; /* * 世纪末的星期 * 曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会… * 有趣的是,任何一个世纪末的年份的12月31日都不可能是星期一!! 于是&…

php socket说明 stream流说明

socket说明 我们都知道通过IP,端口等可以实现两台机器之间的数据互通,但具体要怎么操作,系统给我们提供了socket接口,通过调用socket函数就可以实现互通。php的socket扩展和C本身的非常相似,如果找不到php相关的资料&…

[附源码]SSM计算机毕业设计中小学微课学习系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

【C++】日期类的实现

​🌠 作者:阿亮joy. 🎆专栏:《吃透西嘎嘎》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 目录👉前言&…

MySQL8.0优化 - 事务的隔离级别

文章目录学习资料事务的隔离级别脏读、不可重复读、幻读脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom)SQL中的四种隔离级别读未提交(READ UNCOMMITTED)读已提交&am…

北京化工大学数据结构2022/11/17作业 题解

(7条消息) 食用前须知(阅读并同意后在食用其他部分)_lxrrrrrrrr的博客-CSDN博客 看完进来哈 目录 问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式) 问题 B: 算法7-12:有向无环图的拓扑排序 问题 C: 有向图是否存…

剪枝算法:通过网络瘦身学习高效卷积网络

摘要 原文链接:https://arxiv.org/abs/1708.06519 深度卷积神经网络(CNNs)在现实世界中的应用很大程度上受到其高计算成本的阻碍。在本文中,我们提出了一种新的cnn学习方案,以同时减小模型的尺寸;2)减少运行时内存占用;3)在不影响精度的前…

[附源码]java毕业设计企业职工福利发放管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

WPF TreeView数据回填

这一期简单的说一下这个TreeView的数据回填, 上图是查询类型数据 上图是服务端的数据传递, 从数据库对应的查询出的数据传到服务端然后再传到客户端 上图就是在客户端后台启用刷新中的代码, DefaultView 获取自定义的视图 ItemsSource 获取…

如何在两个相关泛型类之间创建类似子类型的关系

本文正在参加「金石计划 . 瓜分6万现金大奖」 哈喽大家好,我是阿Q! 事情是这个样子的...... 对话中的截图如下: 看了阿Q的解释,你是否也和“马小跳”一样存在疑问呢?请往👇看 我们都知道在java中&#x…

领英高效开发客户方法(建议收藏)

领英高效开发客户 有效使用linkedIn领英,充分利用其人脉来为我们外贸人开发客户服务,我们也能获得外贸业-务更多更好机遇,扩大自己的外贸人脉圈。 在这里和大家分享一下,如何利用好领英linkedIn,轻松免-费地开发国外客…

深度学习入门(四十二)计算机视觉——目标检测和边界框

深度学习入门(四十二)计算机视觉——目标检测和边界框前言计算机视觉——目标检测和边界框课件图片分类和目标检测边缘框目标检测数据集总结教材1 边界框2 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文记录用,防止遗忘…

m基于MATLAB数字调制解调仿真,包括ASK,FSK,DPSK及MDPSK,对比误码率

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 振幅键控(也称幅移键控),记做ASK,或称其为开关键控(通断键控),记做OOK 。二进制数字振幅键控通常记做2ASK。 对于振…

Spring Cloud(十一):Spring Cloud Security Oauth2

OAuth2 登录历程 basic 用户名:密码session cookietokenjwt 登录流程分析: https://www.processon.com/view/link/60a32e7a079129157118740f 微信开发平台文档: https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Logi…