并发编程出现的问题以及解决方式
解决并发编程出现的问题
基于java内存模式的设计出现的问题
基于java内存模式的设计,多线程操作一些共享的数据时,出现以下三个问题:
1.不可见性问题:多个线程同时在各自的工作内存对共享数据进行操作,彼此之间不可见。操作完写会主内存,有可能出现问题。
2.无序性:为了性能,对一些代码指令的执行顺序调整重排,以提高速度。在某种情况下,顺序调整后,可能会对后续代码操作进行影响。
3.非原子性:对进程的程序代码分割进行了,由于线程切换而导致
缓存(工作内存)带来了不可见性;
指令重排优化,带来了无序性;
线程切换,带来了非原子性;
解决办法
让不可见变为 可见:各自的工作内存的共享数据可以实时刷新
让无序变为 不乱序:不对代码重新排序
非原子执行 变为原子:加锁
1.实现可见性和有序性
volatile关键字
volatile修饰的是变量
解决了两个问题
volatile所修饰的变量被一个线程修改后,可以在其他线程中立即可见。可解决不可见问题;
volatile修饰的变量,在执行的过程中与它相关的代码不会被重排序执行。可解决无序性问题;
但volatile不能解决原子性问题
volatile 底层实现原理
在底层指令级别来进行控制
volatile修饰的变量在操作前,添加内存屏障,不让其他的指令干扰。
volatile修饰的内存变量添加内存屏障之外,还要通过缓存一致性协议(MESI)将数据写回到主内存,其他工作内存嗅探后把自己工作内存数据过期,重新从主内存读取最新的数据。
2.实现原子性
(1)加锁
通过加锁的方式,让程序互斥执行来保持一次只有一个线程对共享资源访问。
加锁的两种方式:
synchronized:关键字 修饰代码块,方法 自动获取锁、自动释放锁
Reentrantlock:类 只能修饰代码块 手动加锁、释放锁
(2)使用原子类(非加锁)
在java中,还提供了一些原子类,是一种无锁实现;在低并发情况下使用;采用了CAS机制(Compare-And-Swap)
原子类的原子性是通过 volatile + CAS 实现原子操作的。 如AtomicInteger类,AtomicInteger 类中的 value 是有 volatile 关键字修饰的,这就保证了 value的内存可见性,这为后续的 CAS 实现提供了基础。
这里说一下CAS机制:
CAS(面试中出现频率很高)
CAS机制(Compare-And-Swap),比较并交换,该算法是硬件对于并发操作的支持;
是乐观锁的一种实现方式;
特点:
是一种无锁实现;
只能在低并发情况下使用;
不加锁,所有线程都可以对共享数据操作;
由于不加锁,所以不会阻塞,效率比加锁高;
采用自旋思想;
自旋思想:
第一次采取内存值到工作内存中,存储起来作为预期值。然后对象数据进行修改,将工作内存值写入到主内存;
在写入之前需要做一个判断,用预期值与主内存中的值进行比较,如果预期值与主内存中值一致,说明这个变量没有其他线程修改,则将更新后的值,写入到主内存;
如果预期值与主内存中值不一致,说明其他进行修改了主内存的值,这时就需要重复这个过程;
概念:即每次判断我的预期值A和内存中的值V是不是相同,如果不相同则说明该内存值已经被其他线程更新过了,因此需要拿到该最新值B作为预期值,重新判断。而该线程不断的循环判断是否该内存值已经被其他线程更新过了。
CAS缺点
CAS使用自旋锁的方式,由于该锁会不断循环判断,因此不会synchronize线程阻塞导致线程切换,但是会不断自旋,导致cpu的消耗,在并发量大的时候导致cpu跑满。
导致ABA问题,通过设置版本号,每次操作改变版本号即可
相关文章:
并发编程出现的问题以及解决方式
解决并发编程出现的问题基于java内存模式的设计出现的问题基于java内存模式的设计,多线程操作一些共享的数据时,出现以下三个问题:1.不可见性问题:多个线程同时在各自的工作内存对共享数据进行操作,彼此之间不可见。操…...
[ linux ] linux 命令英文全称及解释
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】🎉点赞➕评论➕收藏 养成习…...
C++11新特性
文章目录说在前面花括号{}初始化new的列表初始化STL相关容器的列表初始化相关语法格式容器列表初始化的底层原理forward_list和array与类型相关的新特性decltype左值引用和右值引用什么是左值,什么是右值左值和右值的本质区别右值引用如何理解右值引用std::move移动…...
【宝塔部署SpringBoot前后端不分离项目】含域名访问部署、数据库、反向代理、Nginx等配置
一定要弄懂项目部署的方方面面。当服务器上部署的项目过多时,端口号什么时候该放行、什么时候才会发生冲突?多个项目使用redis怎么防止覆盖?Nginx的配置会不会产生站点冲突?二级域名如何合理配置?空闲的时候要自己用服…...
从0到1一步一步玩转openEuler--11 openEuler基础配置-设置磁盘调度算法
11 openEuler基础配置-设置磁盘调度算法 文章目录11 openEuler基础配置-设置磁盘调度算法11.1 设置磁盘调度算法11.1.1 临时修改调度策略11.1.2 永久设置调度策略11.1 设置磁盘调度算法 本节介绍如何设置磁盘调度算法。 11.1.1 临时修改调度策略 例如将所有IO调度算法修改为…...
河道治理漂浮物识别监测系统 yolov7
河道治理漂浮物识别监测系统通过yolov7网络模型深度视觉分析技术,河道治理漂浮物识别监测算法模型实时检测着河道水面是否存在漂浮物、水浮莲以及生活垃圾等,识别到河道水面存在水藻垃圾等漂浮物,立即抓拍存档预警。You Only Look Once说的是…...
微信小程序 java ssm Springboot学生作业提交管理系统
系统具有良好的集成性,提供标准接口,以实现与其他相关系统的功能和数据集成。开放性好,便于系统的升级维护、以及与各种信息系统进行集成。功能定位充分考虑平台服务对象的需求。 一个微信小程序由.js、.json、.wxml、.wxss四种文件构成&…...
实战项目-课程潜在会员用户预测(朴素贝叶斯&神经网络)
目录1、背景介绍2、朴素贝叶斯2.1 模型介绍2.2 模型实现3、人工神经网络1、背景介绍 目标:将根据用户产生的数据对课程潜在的会员用户(可能产生购买会员的行为)进行预测。 平台的一位注册用户是否购买会员的行为应该是建立在一定背景条件下…...
ESP32设备驱动-定时器与定时器中断
定时器与定时器中断 文章目录 定时器与定时器中断1、ESP32定时器介绍2、定时器相关API介绍3、软件准备4、硬件准备3、代码实现有时需要按时发生某些事情,这就是计时器和计时器中断发挥作用的地方。 定时器是一种中断。 它就像一个简单的时钟,用于测量和控制时间事件,提供精确…...
【JavaScript 逆向】安居客滑块逆向分析
声明本文章中所有内容仅供学习交流,相关链接做了脱敏处理,若有侵权,请联系我立即删除!案例目标验证码:aHR0cHM6Ly93d3cuYW5qdWtlLmNvbS9jYXB0Y2hhLXZlcmlmeS8/Y2FsbGJhY2s9c2hpZWxkJmZyb209YW50aXNwYW0以上均做了脱敏处…...
【STM32】【HAL库】遥控关灯1主机
相关连接 【STM32】【HAL库】遥控关灯0 概述 【STM32】【HAL库】遥控关灯1主机 【STM32】【HAL库】遥控关灯2 分机 【STM32】【HAL库】遥控关灯3 遥控器 需求 主机需要以下功能: 接收来自物联网平台的命令发送RF433信号给从机接收RF433信号和红外信号驱动舵机动作 方案设计…...
Java 初始化块
文章目录1、初识初始化块2、实例初始化块和构造器3、类初始化块1、初识初始化块 Java 使用构造器来对单个对象进行初始化操作,使用构造器先完成对整个 Java 对象的状态初始化,然后将 Java 对象返回给程序,从而让该 Java 对象的信息更加完整。…...
超详细讲解长度受限制的字符串函数(保姆级教程!!!)
超详细讲解长度受限制的字符串函数(保姆级教程!!!)长度受限制的字符串函数strncpy函数strncpy函数的使用strncpy函数的模拟实现strncat函数strncat函数的使用strncat函数的模拟实现strncmp函数strncmp函数的使用strncm…...
【c#】c#常用小技巧方法整理(4)——cmd命令提示符,c#调用cmd
CMD命令是一种命令提示符,CMD是command的缩写,位于系统System32的目录下,是大多数Windows操作系统中可用的命令行解释器应用程序。用于执行输入的命令。其中大多数命令通过脚本和批处理文件自动执行任务,执行高级管理功能…...
在项目中遇到的关于form表单的问题
前言 以下内容都是基于element Plus 和 vue3 一个form-item校验两个下拉框 有时候不可避免会遇到需要一个form-item校验两个下拉框的情况,比如: 这种情况下传统的校验已经无法实现,需要通过form表单提供的自定义校验来实现。以上面的必填…...
德国奔驰、博世和保时捷的员工年薪有多少?
点击 欧盟IT那些事 关注我们公告:因企鹅审核规定,本公众号从《德国IT那些事》更名为《欧盟IT那些事》。从职场新人到总裁,一个个盘。位于德国斯图加特的梅赛德斯-奔驰集团及其子公司梅赛德斯-奔驰是世界最知名的汽车制造商之一。奔驰车代表着…...
Mybatis与微服务注册
目录 一,Springboot整合MybatisPlus 创建商品微服务子模块 二,SpringBoot整合Freeamarker 三、SpringBoot整合微服务 &gateway&nginx 整合微服务之商品服务zmall-product 创建并配置网关gateway服务 安装配置SwitchHosts 安装配置Windo…...
JAVA练习47-合并两个有序数组
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、题目-合并两个有序数组 1.题目描述 2.思路与代码 2.1 思路 2.2 代码 总结 前言 提示:这里可以添加本文要记录的大概内容: 2月11日练习…...
右键菜单管理 - Win系统
右键菜单管理 - Win系统前言软件工具管理右键菜单360右键管理右键管家前言 Windows系统可以借助软件工具对右键菜单进行管理,可对指定的右键菜单进行删除和恢复。下面以Win10系统为例介绍管理方法。 注意:使用本文提及的工具将某软件的右键菜单删除后&…...
背包问题求方案数、具体方案
背包问题求方案数、具体方案01背包问题求体积恰好等于V的方案数完全背包问题求体积恰好等于V的方案数01背包问题求最优选法的方案数完全背包问题求最优选法的方案数01背包问题求具体方案01背包问题求体积恰好等于V的方案数 原题链接AcWing278. 数字组合 考虑状态表示&#x…...
革新性英雄联盟效率工具:League-Toolkit为玩家打造智能游戏体验
革新性英雄联盟效率工具:League-Toolkit为玩家打造智能游戏体验 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节…...
新手必看:用快马AI生成HTML链接代码示例,轻松掌握网页跳转
今天想和大家分享一个特别适合新手入门HTML链接标签的小技巧。作为一个刚接触前端开发的小白,我发现理解各种链接的写法其实并不难,关键是要有直观的示例和实时反馈。最近在InsCode(快马)平台上尝试用AI生成代码,发现它特别适合用来学习基础H…...
从Autoencoder到VAE:探索生成模型的演进之路
1. 从数据压缩到生成模型:Autoencoder的诞生 2006年,当Geoffrey Hinton团队首次提出Autoencoder(自编码器)时,这个看似简单的神经网络结构悄然打开了深度学习的新篇章。想象一下你正在整理杂乱的书架——先把书籍按主题…...
深入解析Bluetooth AVDTP协议:音频/视频传输的核心机制
1. 蓝牙AVDTP协议初探:音频视频传输的幕后英雄 每次用蓝牙耳机听音乐或看视频时,你可能没意识到背后有个"隐形交通警察"在指挥数据流动。这个默默工作的角色就是AVDTP协议(Audio/Video Distribution Transport Protocol)…...
保姆级教程:用InVEST 3.14.0中文版搞定毕业论文碳储量计算(附数据预处理避坑指南)
零基础科研实战:InVEST碳储量计算全流程精解与避坑指南 刚接触InVEST模型的新手研究者,往往会在碳储量计算的第一步就陷入数据沼泽——为什么我的土地利用数据无法加载?为什么运行结果出现负值?这些看似简单的操作背后,…...
Fast-Android-Networking请求优先级设置终极指南:提升应用性能的10个技巧
Fast-Android-Networking请求优先级设置终极指南:提升应用性能的10个技巧 【免费下载链接】Fast-Android-Networking 🚀 A Complete Fast Android Networking Library that also supports HTTP/2 🚀 项目地址: https://gitcode.com/gh_mirr…...
OpenClaw+GLM-4.7-Flash实战:个人自动化办公助手搭建指南
OpenClawGLM-4.7-Flash实战:个人自动化办公助手搭建指南 1. 为什么选择本地AI办公助手 去年夏天,我发现自己每天要花3小时处理重复性办公任务:整理邮件、归档文档、撰写会议纪要。当我尝试用传统RPA工具时,发现它们要么太死板&a…...
动态代理·学习笔记
“嗨,阿米戈。” “你好,瑞希。” “今天我将向您解释一个非常有趣的新话题:动态代理”。 “Java 有几种方法可以改变特定类的功能……” “第一个方法,传承。” “更改类行为的最简单方法是创建一个继承原始(基)类的新类,并覆盖其方法。然后,使用派生类而不是原始…...
网页设计毕业设计选题指南:从零构建一个响应式个人作品集网站
作为一名即将毕业的计算机相关专业学生,你是否正为“网页设计”这门课的毕业设计选题而头疼?选题太简单,显得没技术含量;选题太复杂,又怕自己搞不定,最后做出一个只能在老师电脑上运行的“演示即崩溃”项目…...
文旅直播助农成新风口!巨有科技数智工具,复刻董宇辉“阅山河”助农模式
当下,文旅直播助农成为乡村振兴与文旅融合的新风口,董宇辉“阅山河”模式开创“边走边播、以文促农”的新范式,通过沉浸式文旅直播,实现“文旅引流农产品变现”的双向赋能,带动多地农产热销与文旅发展,但CS…...
