07JVM_内存模型和CAS与原子类

news2024/11/23 21:21:08

一、内存模型

1.java内存模型

Java内存结构是JMM(Java Memory Model)的意思。JMM定义了一套在多线程读写共享数据(成员变量,数组)时,对数据原子性,见性,有序性的规则和保障。

1.1 原子性

什么是原子性?

原子性是指一个操作是不可中断的,即使多个线程一起执行,一个线程一旦开始,就不会被其他线程干扰。

如何保证原子性

synchronized(同步关键字)

synchronized(对象){

  原子操作代码

}

从第一个线程开始,给这个对象加,可以安全执行原子操作代码。其他线程需要排队等候

synchronized解决并发问题

②各种Lock

synchronized 和各种 Lock 可以保证任一时刻只有一个线程访问该代码块,因此可以保障原子性

1.2 可见性

什么是可见性?

可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。

如何保证可见性

在 Java 中,可以借助synchronized、volatile 以及各种 Lock 实现可见性。如果我们将变量声明为 volatile ,这就指示 JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。

volatile

修饰成员变量和静态成员变量,避免线程从自己的工作缓存查找变量的值,必须到主存获取它的值,线程操作volatile变量都是直接操作主存

1.3有序性

什么是有序性?

①由于指令重排序问题,代码的执行顺序未必就是编写代码时候的顺序。

②指令重排序可以保证串行语义一致,但是没有义务保证多线程间的语义也一致 ,所以在多线程下,指令重排序可能会导致一些问题。

③在Java中,volatile关键字可以禁止指令进行重排序优化

2.happens-before

介绍

happens-before规定哪些写操作对其他线程的读操作可见。是可见性有序性的一套规则。

如何保证

①volatile

②synchronized

二、CAS与原子类

1.CAS无锁并发概述

1.介绍

①CAS全称compare and swap比较并交换

②当多个线程同时操作同一个资源,只能有一个线程操作成功。但是不会阻塞其他线程,其他线程只会收到操作失败的信号。

③CAS是一个乐观锁

补充

乐观锁:认为数据在一般情况下不会产生冲突,所以在数据提交更新的时候,才会对数据是否产生并发冲突进行检测,如果发现并发冲突,则返回错误信息,返回的错误信息可以根据自己的业务进行处理

悲观锁:总是假设最坏的情况,每次在获取共享数据的时候,都认为别人会修改,所以每次都在获取数据的时候加锁。共享资源每次只会给一个线程使用,其他线程阻塞,用完再把资源给其他线程

2.工作流程

读写的内存值V

进行比较的值A

需要写入的新值B

①内存中的原数据V,旧值A,修改的新值B。

比较A与V是否相等

③如果相等,将B写入V(交换)

④返回操作是否成功

3.代码分析

多个线程对一个共享的整型变量执行+1操作

①CAS不加锁,使用while(true)死循环不管尝试/

共享变量是从内存读取的,所以保证变量的可见性。使用volatile修饰

③调用compareAndSwap(旧值,新值)进行比较。

④compareAndSwap操作成功退出循环。

⑤compareAndSwap操作失败,说明其他线程把这个共享变量修改了。需要再次循环读取

注意:

①CAS和volatile结合实现无锁并发,适用竞争不激烈多核CPU(循环重试)

②竞争激烈,重试频繁发生,降低效率

③没有使用用synchronized,线程不会阻塞,提升效率。

4.CAS的缺点

ABA问题,CAS更新操作的时候检查内存值是否变化,没有变化更新内存值。如果原来内存值A,后来变成B,然后再变回A。出现ABA问题,CAS检查没有变化,实际变化了。解决方法就是变量前面加一个版本号,每次更新版本号加1。这样变化成了1A2B3A

②循环时间长,开销大。CAS操作长时间不成功,会导致一直循环。CPU开销大

③只保证一个共享变量的原子操作。对一共享变量执行操作时,CAS能够保证原子操作,但对多个共享变量操作时,CAS无法保证操作的原子性。

2.CAS底层实现

介绍

CAS底层是依赖一个Unsafe直接调用操作系统底层的CAS指令。

调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令

部分代码

public final boolean compareAndSet(int expect, int update) {

        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);

}

参数说明

this Unsafe对象

valueOffset 共享变量的地址

expect 旧值

update 新值

如果原子变量中的 value 值等于 expect,则使用 update 值更新该值并返回 true,否则返回 false。

3.原子操作类

juc提供原子操作类,可以提供线程安全的操作。AtomicInteger,AtomicBoolean。底层实现是CAS+volatile实现

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

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

相关文章

浅谈电力电容器技术的发展及选型

安科瑞 华楠 摘要:介绍了我国电力电容器产品制造技术的发展现状。在与国外电力电容器产品先进水平对比的基础上,讨论了我国电力电容器产品的差距和某些对策,并对我国电力电容器技术发展趋势提出了一些看法。 关键词:电力电容器;制造技术;技术发展 0 引…

每日一题~最大二叉树

题目链接:654. 最大二叉树 - 力扣(LeetCode) 题目描述: 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数…

Logstash介绍

Logstash介绍 Logstash是一个开源数据收集引擎,具有实时管道功能。Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地。 集中、转换和存储你的数据 Logstash是一个开源的服务器端数据处理管道,可以同时从多…

采集分析仪设计原理图:437-带触摸显示的10路5Msps@18bit采集分析仪

带触摸显示的10路5Msps18bit采集分析仪 一、产品概述 本产品提供了多种传感器接入接口,支持多种类型传感器实时采集、处理、显示等功能。主处理器采用XC7Z100-FFG900芯片,具有444K逻辑单元和双核ARM Cortex-A9 MPCore处理器。PL部分得可编程逻辑可…

docker系列-报错以及解决指南

1. windows运行docker报错Windows Hypervisor is not presentDocker Desktop is unable to detect a Hypervisor.Hardware assisted virtualization and data execution protection must be enabled in the BIOS. Docker Desktop - Windows Hypervisor is not presentDocker D…

async和await的用法

定义 async的定义 在mdn中,async的定义为: async function 关键字可用于定义表达式中的异步函数。 其实很简单,就是async关键字后面定义的函数会被转化为一个异步的函数 如下所示: function fn1(){return 同步}async function asyncFn(){return 异步}console.log(fn1())con…

Dubbo3应用开发——架构的演变过程

Dubbo3应用开发——架构的演变过程 什么是Dubbo 早期Dubbo的定位; 基于Java的高性能,轻量级的RPC框架;SOA【Service-Oriented Architecture ⾯向服务的架构】 RPC服务治理; 2018年阿⾥巴巴把这个框架捐献给了 Apache 基⾦会&am…

深入理解Java单例模式和优化多线程任务处理

目录 饿汉模式懒汉模式单线程版多线程版双重检查锁定 阻塞队列 单例模式能保证某个类在程序中只存在唯一一份实例, 而不会创建出多个实例,并提供一个全局访问点。 饿汉模式 类加载的同时,创建实例。 class Singleton {private static final Singlet…

2023:生成式AI与存储最新发展和趋势分析(上)

生成式AI的热潮在短时间内席卷全球,以一种势不可挡的趋势迅速出圈,在某一时间段,似乎出现了“除了IT行业,人人都是AI专家”的盛况。这一轮如火如荼的全民AI热潮迸发至今,业已过半载,待最初的烟花绚烂散去&a…

【基础篇】六、基于SpringBoot来整合SSM的案例(下)

文章目录 1、前后端调用:axios发送异步请求2、添加功能3、删除功能4、修改功能5、异常消息处理6、分页功能7、分页Bug处理8、条件查询 接下来加入前端页面,使用axios发送异步请求调用上篇的接口。调前端代码时,发现还挺有趣,刷新、…

Learn Prompt-ChatGPT 精选案例:广告文案

ChatGPT 可以帮助我们生成广告文案和宣传图片,这对营销品牌建设很有帮助。通常,一个产品会有一个主要的广告词,传达设计理念或宣传产品的好处。我们可以尝试直接生成文案,看看 ChatGPT 有没有好的创意。假设我们的产品是一款登山鞋…

【css | linear-gradient】linear-gradient()的用法

linear-gradient() CSS函数创建一个由两种或多种颜色沿一条直线进行线性过渡的图像,其结果是<gradient>数据类型的对象,此对象是一种特殊的<image> 数据类型。 先看一个线上的示例 https://code.juejin.cn/pen/7277486410842996771 语法 /* 渐变轴为 45 度&…

Docker容器详解

值得看的原文地址

一根USB线,全新单片机开发体验!推荐WeCanStudio工具套件

我的需求 回想当初大学时代,学习单片机的开发最繁琐的事情就是,通过串口升级STC的MCU来调试编写的固件。不知到有多少个深夜都在重复以下步骤&#xff1a; Keil编译代码打开STC软件,选择对生成的新固件程序手动断电、上电MCU板子(USB转串口的驱动还经常让电脑蓝屏&#x1f6…

极智开发 | 制作u盘启动盘的几种方式

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 制作u盘启动盘的几种方式。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 在平时的工作、生活中,经常会涉及…

Bigemap在市政工程设计给排水行业的应用场景?

去年单位采购的&#xff0c;今年11月份才分配给我使用。 使用场景&#xff1a; 现场定位&#xff1a; 通过我们电脑导入cad图纸数据&#xff0c;根据需求可以画一些简单的示意路线&#xff0c;发送到手机进行现场比对&#xff0c;最后会在cad里面加入管道设计方案。 去年单位采…

Windows Server 2012 R2系统远程桌面的数字证书算法SHA1升级到SHA256

问题描述&#xff1a; 最近项目进行密评的时候&#xff0c;Windows Server 2012 R2发现了以下证书问题&#xff1a; Windows Server 2012 R2系统远程桌面的TLS 1.2协议使用SHA1算法数字证书&#xff0c;且证书有效日期截止23年10月&#xff0c;建议注意证书到期时间&#xff…

极简解析!IP计费的s5爬虫IP

大家好&#xff01;今天我将为大家分享关于s5爬虫IP服务的知识。对于经常做爬虫的小伙伴来说&#xff0c;需要大量的爬虫IP支持爬虫业务&#xff0c;那么对于选择什么样的爬虫IP&#xff0c;我想我有很多发言权。 下面我们一起了解下IP计费的s5爬虫IP的知识&#xff0c;废话不…

Spring Boot + Vue3前后端分离实战wiki知识库系统<十三>--单点登录开发二

接着Spring Boot Vue3前后端分离实战wiki知识库系统<十二>--用户管理&单点登录开发一继续往下。 登录功能开发&#xff1a; 接下来则来开发用户的登录功能&#xff0c;先准备后端的接口。 后端增加登录接口&#xff1a; 1、UserLoginReq&#xff1a; 先来准备…

都在谈网关,Modbus网关到底是什么

随着工业自动化的不断发展&#xff0c;各种协议和标准在行业中变得越来越重要。其中&#xff0c;Modbus协议是一种在工业自动化领域非常流行的通信协议&#xff0c;而Modbus网关是实现Modbus协议转换的关键设备。本文将介绍HiWoo Box&#xff0c;作为Modbus网关的应用和发展趋势…