并发编程要点
Java并发编程中的三大特性分别是原子性、可见性和有序性,它们分别靠以下机制实现:
-
原子性:原子性指的是对于一个操作,要么全部执行,要么全部不执行。Java提供了一些原子性操作,例如AtomicInteger等,它们使用了底层的CAS(Compare and Swap)操作来保证操作的原子性。CAS操作是一种乐观锁技术,当期望值和实际值相同时,才会进行更新操作,否则会进行重试。
-
可见性:可见性指的是当一个线程对共享变量进行修改后,其他线程能够立即看到这个值的改变。Java中,可以使用volatile关键字来保证变量的可见性。volatile关键字可以保证该变量对于所有线程的可见性,即当一个线程修改了该变量的值后,其他线程能够立即看到这个值的改变。同时,在JMM规范中,对于volatile变量的读取操作和写入操作会在读操作之前插入Load with Barrier屏障,保证该操作之前的所有写操作都已经完成,同时在写操作之后插入Store with Barrier屏障,保证该操作之后的所有读操作都能看到修改后的值。这样可以保证对于volatile变量的访问操作具有原子性、有序性和可见性。
-
有序性:有序性指的是对于一个线程内的操作,它们的执行顺序是按照代码顺序执行的。在Java中,可以使用synchronized关键字和Lock对象等同步机制来保证线程内的有序性。这些同步机制会保证同步代码块内的代码按照代码顺序执行,从而保证了有序性。
总的来说,Java并发编程中的三大特性分别是原子性、可见性和有序性。原子性可以通过原子性操作和CAS操作来保证;可见性可以通过volatile关键字来保证;有序性可以通过同步机制(synchronized关键字和Lock对象)来保证。
Volitile关键字
在Java中,使用volatile关键字声明的变量具有特殊的属性。volatile关键字可以保证该变量对于所有线程的可见性,即当一个线程修改了该变量的值后,其他线程能够立即看到这个值的改变。volatile关键字可以解决多线程访问共享变量时出现的线程安全问题。
在JMM规范中,对于volatile变量的读取操作和写入操作,会在读操作之前插入Load with Barrier屏障,保证该操作之前的所有写操作都已经完成,同时在写操作之后插入Store with Barrier屏障,保证该操作之后的所有读操作都能看到修改后的值。这样可以保证对于volatile变量的访问操作具有原子性、有序性和可见性。
使用volatile关键字修饰的变量在修改值时不会被本地线程缓存,而是直接操作主内存中的变量,因此能够保证变量的可见性。同时,由于volatile关键字可以保证变量的可见性,因此也可以保证使用该变量的操作是原子性的。
需要注意的是,volatile关键字只能保证对单个变量操作的原子性和可见性,并不能保证一系列操作的原子性,例如i++操作。如果需要保证多个操作的原子性,可以使用synchronized关键字或者Lock对象等同步机制。
总之,volatile关键字是Java中用于解决多线程访问共享变量时出现的线程安全问题的一种手段,可以保证变量的可见性和操作的原子性。
volatile关键字可以保证变量对于所有线程的可见性,并且禁止指令重排序。为了实现这些特性,JMM在编译器和处理器的操作之间插入了特定类型的内存屏障,分别是:
-
Load with Barrier屏障(LoadLoad屏障):这个屏障用于保证volatile读操作之前的所有读操作和写操作都已经完成。
-
Store with Barrier屏障(StoreStore屏障):这个屏障用于保证volatile写操作之后的所有写操作都已经完成。
-
Store with Load屏障(StoreLoad屏障):这个屏障用于保证volatile写操作之后,对于volatile变量的读操作能够读取到修改后的最新值。
这些内存屏障都是通过编译器和处理器来实现的,编译器会在生成字节码时插入相关的指令,处理器在执行指令时会根据相关的屏障来保证指令的执行顺序和可见性。通过这些屏障,JMM保证了volatile变量的可见性、有序性和原子性。
Synchronize关键字
synchronized是Java中一种用于实现线程同步的关键字,其底层实现主要涉及到对象头、Monitor(监视器)和锁升级三个方面。
-
对象头:在Java对象头中,有一块用于存储锁信息的部分,包括锁标记、偏向线程ID、偏向时间戳等信息。synchronized关键字就是利用了Java对象头中的锁标记来实现线程同步的。
-
Monitor:Monitor是一种同步机制,用于实现线程的互斥和协作。在Java虚拟机中,每个对象都会与一个Monitor相关联。当一个线程进入synchronized代码块时,会尝试获取该对象的Monitor,如果该Monitor已经被其他线程占用,那么该线程就会被阻塞。
-
锁升级:Java中的锁有多种状态,包括无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。synchronized关键字使用的是重量级锁,但是在竞争不激烈的情况下,可以使用偏向锁或轻量级锁来优化性能。偏向锁是指在没有竞争的情况下,将锁标记设置为偏向线程的ID,使得该线程可以不需要每次都去竞争锁,提高了程序的运行效率。轻量级锁是指在竞争不激烈的情况下,使用CAS操作来实现锁的获取和释放,避免了线程的上下文切换,也提高了程序的运行效率。但是如果竞争激烈,轻量级锁就会升级为重量级锁,这样就会带来较大的性能损失。
总的来说,synchronized关键字的底层实现主要涉及到对象头、Monitor和锁升级三个方面。在Java虚拟机中,每个对象都会与一个Monitor相关联,当一个线程进入synchronized代码块时,会尝试获取该对象的Monitor。synchronized关键字使用的是重量级锁,但是在竞争不激烈的情况下,可以使用偏向锁或轻量级锁来优化性能。
相关文章:
并发编程要点
Java并发编程中的三大特性分别是原子性、可见性和有序性,它们分别靠以下机制实现: 原子性:原子性指的是对于一个操作,要么全部执行,要么全部不执行。Java提供了一些原子性操作,例如AtomicInteger等…...
HDFS黑名单退役服务器
黑名单:表示在黑名单的主机IP地址不可以,用来存储数据。 企业中:配置黑名单,用来退役服务器。 黑名单配置步骤如下: 1)编辑/opt/module/hadoop-3.1.3/etc/hadoop目录下的blacklist文件 添加如下主机名称&…...
基于stm32智能语音电梯消毒系统
这次来分享个最近做的项目,stm32智能语音电梯消毒系统功能说明:在电梯,房间,客道区域内,检测到人,则执行相关动作!例如继电器开关灯,喷洒酒精等行为。手机app/微信小程序可以控制需要…...
FreeRTOS系列第1篇---为什么选择FreeRTOS?
1.为什么学习RTOS? 作为基于ARM7、Cortex-M3硬件开发的嵌入式工程师,我一直反对使用RTOS。不仅因为不恰当的使用RTOS会给项目带来额外的稳定性风险,更重要的是我认为绝大多数基于ARM7、Cortex-M3硬件的项目,还没复杂到使用RTOS的地…...
基于.NET Core内置浏览器窗体应用程序界面框架
更多开源项目请查看:一个专注推荐.Net开源项目的榜单 平常我们在做项目过程中,桌面软件具备操作高效、利用本地计算机做一些复杂运算、或者设定快捷操作等优势,但是桌面软件也有很多缺点,比如升级问题、系统兼容问题、系统bug排查…...
【数据结构初阶】一文带你学会归并排序(递归非递归)
目录 前言 递归实现 代码实现 非递归实现 代码实现 总结 前言 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 作为一种典型的分而治之思想…...
Simulink壁咚(一)——What and How
目录 一、前言 二、Simulink 知多少 三、滤波算法 四、Model Verification 五、Model Coverage 六、Simulink测试实例 七、Simulink Test 八、Test Manager 九、Test Harness 十、 学习 一、前言 Simulink从2017b以后更加工程化和实用化,基于MBD的功能日趋…...
【PyTorch】Pytorch基础第0章
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 这是目录PyTorch的简介PyTorch 构建深度学习模型的步骤搭建pytorch使用环境PyTorch的简介 PyTorch 是一个开源的机器学习框架,由 Facebook 的人工智能研究院(…...
Android学习总结
积累熟练掌握 Java 语言,面向对象分析设计能力,反射原理,自定义注解及泛型,多次采用设计模式重构公司项目;熟练掌握 IVM 原理,反射,动态代理以及对 ClassLoader 热修复有比较深的理解࿱…...
虚拟机ubuntu安装samba服务
安装samba apt-get install samba 新建一个共享目录 mkdir /home/l/work chmod 777 /home/l/work 配置服务 配置 /etc/samba/smb.confsudo smbpasswd -a l(添加用户名名称) 防火墙关闭 Ubuntu中 我们使用命令查看当前防火墙状态; sudo ufw status inactive状态是防火墙关闭…...
开发板中的内存压力测试,你了解多少?
1. 测试目的内存压力测试的目的是评估开发板中的内存子系统性能和稳定性,以确保它能够满足特定的应用需求。开发板通常用于嵌入式系统、物联网设备、嵌入式智能家居等场景,这些场景对内存的要求通常比较高。其内存压力测试的主要目的有:1.对确…...
MATLAB | 这些花里胡哨的热图怎么画
好早之前写过一个绘制相关系数矩阵的代码,但是会自动求相关系数,而且画出来的热图只能是方形,这里写一款允许nan值出现,任意形状的热图绘制代码,绘制效果如下: 如遇到bug请后台提出,并去gitee下…...
Java开发的一些编码建议
1、无论是类、方法、字段、变量,尽可能的限制他们的作用范围,可以避免出现不必要的错误;同时虚拟机也能有更大的优化空间。 2、错误越早发现越好,编译时发生错误比在运行时发生错误好。而且编译时错误能更好的定位问题所在。 这…...
【YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进NO.59】引入ASPP模块
前言作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍&…...
C++STL set/multiset容器 构造和赋值 大小和交换 插入和删除 查找和统计
文章目录set/multiset容器1 set容器 基本概念2 set容器 构造和赋值3 set容器 大小和交换4 set容器 插入和删除5 set容器 查找和统计set/multiset容器 1 set容器 基本概念 简介: 所有元素都会在插入时会被自动排序,例如,在set容器放入元素1、…...
产品研发项目进度管理软件工具有哪些推荐?整理10款最佳进度管理软件
项目进度管理是确保项目按时完成的关键过程,使用合适的项目进度管理工具能确保帮助项目管理者实时了解和控制项目的进展情况,及时发现和解决问题,减少项目风险,提高项目效率和管理水平。这里将整理出国内外最受欢迎的10款项目进度…...
「ML 实践篇」分类系统:图片数字识别
目的:使用 MNIST 数据集,建立数字图像识别模型,识别任意图像中的数字; 文章目录1. 数据准备(MNIST)2. 二元分类器(SGD)3. 性能测试1. 交叉验证2. 混淆矩阵3. 查准率与查全率4. P-R 曲…...
从大专到测开,上海某字母站大厂的面试题,岗位是测开(25K*16)
简单介绍一句,大专出身,三年经验。跳了四次槽,面试了无数次,现在把自己的面试经验整理出来分享给大家,堪称必杀技! 1,一切从实际出发,对实际工作进行适当修饰 2,不会的简…...
【面试题】Python软件工程师能力评估试题(一)
文章目录前言应试者需知(一)Python 语言基础能力评估1、理解问题并完成代码:2、阅读理解代码,并在空白处补充完整代码:3、编写一个装饰器:exposer4、阅读代码并在空白处补充完整代码:5、自行用P…...
Java八股文(Java多线程面试题)
并行和并发的区别?(1)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生;(2)并行是在不同实体上的多个事件,并发是在同一实体上的多个事件&#…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
