实用指南:深入解析 Java 内存可见性问题:从现象到 volatile 解决方案

news/2025/10/24 9:23:39/文章来源:https://www.cnblogs.com/ljbguanli/p/19162191

实用指南:深入解析 Java 内存可见性问题:从现象到 volatile 解决方案

前面我们提到内存可见性问题也是引起线程安全的一个原因,本文我们就来详细说一下什么是内存可见性问题。

引入问题

import java.util.Scanner;
public class Demo6 {private static int flag=0;public static void main(String[] args) {Thread t1=new Thread(()->{while (flag==0){}System.out.println("t1线程结束");});Thread t2=new Thread(()->{//该线程针对flag进行修改Scanner scanner=new Scanner(System.in);System.out.println("请输入flag的值");flag= scanner.nextInt();});t1.start();t2.start();}
}

由运行结果可以看出,我们输入了一个非0值,但是t1线程并没有结束,所以这也是一个线程安全问题

出现这一现象的原因就是内存可见性问题。

这是因为研究JDK的大佬们,希望通过编译器或者JVM对程序员写的代码进行优化。
编译器或者JVM会在我们原有代码逻辑不变的情况下,对我们的代码进行调整,让我们代码的执行效率提高。
但是虽然编译器声称会让原代码的执行逻辑不变,但在多线程中,编译器的判断可能会失误。
这就导致可能因为编译器的优化,让优化后的逻辑和优化前的逻辑在一些细节上会有些偏差~
那么这时就会出现一些线程安全问题。

分析问题

在上述循环中,flag==0这一判断在计算机中对应的是一个cmp这样的指令。
而一个cmp指令执行之前又要先进行load(读内存操作)指令。
这里要注意的是load的时间开销可能是cmp的几千倍。
而flag的值的修改是在t2线程中等待用户输入的,由于我们并不确定用户多长时间后才修改flag的值,那么这段时间内,JVM就会误以为没人修改flag的数值,flag的数值始终是0。
那么此时,就把读内存的操作优化为了读寄存器的操作
(即把内存中的值读取到寄存器中,后续再进行load操作之后,就不从内存中读取了,直接从寄存器中读取)
那么等到很多秒之后,再修改flag的数值,此时t1线程就感知不到了。
由此可见,编译器优化,使得t1线程的读取操作,不是真正读内存。

调整代码

接下来我们对上述代码的循环内部稍作调整

 while (flag==0){try {Thread.sleep(1);} catch (InterruptedException e) {}}


这次运行结果就是符合我们的预期的,这是什么原因呢?
这是因为当我们加入sleep(1)操作之后就让上面的循环次数大幅度减少了,而且sleep消耗的时间要比load和cmp多得多,那么此时优不优化就无足轻重了。
因此,这次的运行结果是符合我们的预期的。

解决问题

上述问题在编译器优化的角度是难以进行调整的,于是我们在语法中引入了volatile关键字用来解决上述问题(该关键字只能用来修饰变量
话不多说,上代码~~~

 private static volatile int flag=0;

其实很简单,我们只需要在flag前面加上这个关键字即可,此时我们再执行这个代码,运行结果就符合我们的预期了~~~

这是因为 volatile 关键字会强制要求:每次读取该变量时,都必须从内存中重新获取最新值,而不能使用 CPU 寄存器中的数值;每次修改该变量后,也必须立即将新值同步回内存,确保其他线程能 “看到” 最新的变量状态。

结语

通过本文的案例分析,我们不仅搞懂了内存可见性问题的本质 —— 编译器 / JVM 优化导致线程读取不到变量的最新内存状态,还掌握了最直接的解决方案:用 volatile 关键字修饰变量
在实际开发中,当多个线程涉及同一变量的读写操作时,及时使用 volatile,能有效避免因内存可见性引发的线程安全隐患。

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

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

相关文章

换 Windows 新电脑?教你将旧电脑程序传输新电脑技巧

在问,我们将向您展示如何使用可靠的免费 PC 迁移软件将已安装的程序和数据迁移到另一台计算机的完整过程。 本文主要介绍的是使用奇客电脑迁移来完成操作,其是一款适用于 Windows 11/10/8/7/Vista/XP 的免费 PC 迁移…

RocketMQ之原生方式操作

目录1 原生操作1.1 原生生产消息1.2 原生消费消息1.2.1 原生Push和Pull对比1.2.2 Push和SCS和rocketmq1.2.3 Pull 模式(手动拉取)1.2.4 Push 模式1.2.5 其他问题1.2.5.1 拉取间隔pullInterval1.2.5.2 回调线程数Clie…

2025 年低代码平台厂商最新推荐排行榜:深度解析行业实力与创新优势,助力企业精准选型

引言 数字化转型进入深水区,74% 的中小企业将其列为未来三年生存关键,但成功落地比例不足 30%。低代码平台虽成为破局利器,却面临选型困境:部分平台开发效率不足、专业门槛居高不下,或扩展能力有限难以适配复杂场…

react中redux的使用详细说明 - 详解

react中redux的使用详细说明 - 详解2025-10-24 09:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

智能时代下的SEO关键词优化新策略 - 实践

智能时代下的SEO关键词优化新策略 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "M…

2025 年乡墅品牌推荐:湖南鑫住工美宅科技有限公司,为您打造理想乡居生活

随着乡村振兴战略的推进,乡村住宅市场迎来了新的发展机遇。越来越多的城市精英选择回乡建房,对乡墅的品质和服务也提出了更高的要求。在这样的背景下,湖南鑫住工美宅科技有限公司凭借其深厚的行业积淀和创新的服务模…

2025 年桥架源头厂家最新推荐排行榜:聚焦优质品牌核心优势助力采购决策

随着工业基建与新能源领域快速发展,桥架作为电力传输和线缆防护的关键设备,市场需求持续攀升,但行业内厂商资质不一、产品质量参差不齐、服务体系不完善等问题,给采购方带来极大选择难题。为帮助企业及采购人员精准…

2025 人力资源管理系统厂商最新推荐排行榜:聚焦 AI 赋能与行业适配,解锁数智化管理新路径

引言 在 AI 技术深度渗透人力资源管理的 2025 年,系统选型已成为企业突破管理瓶颈的关键抓手。生产制造的工时核算难题、餐饮服务的高流动率管理、物业行业的成本压力以及央国企的合规需求,让企业对专业化 HR 系统需…

2025年10月美白精华评价榜:五款高口碑单品横向对比

入秋以后,紫外线强度虽略有下降,但此前累积的黑色素仍在肌肤底层活跃,加上换季屏障易敏感、代谢变慢,很多人会在10月出现“夏黑反扑”:肤色暗沉、蜡黄、痘印难退。小红书联合益普索发布的《2024中国功效护肤白皮书…

2025 升降机厂家最新推荐排行榜,剪叉式升降机/导轨式升降机/固定式升降机/液压升降机公司推荐

在自动化生产、物流仓储、建筑施工等领域高速发展的当下,丝杆升降机、液压升降机等设备已成为保障作业效率的核心装备,市场需求持续攀升。但行业现存品牌繁杂、质量参差的问题,部分产品存在承载不足、精度偏差等隐患…

(React中组件的)状态(state)和属性(props)之间有何不同?

定义区别对比项 props(属性) state(状态)来源 由 父组件传入 由 组件自身定义和维护是否可修改 不可修改(只读) 可修改(通过 setState 或 useState)作用 用于让组件间 通信(父→子) 用于管理组件内部 动态数…

2025 年最新推荐!AI 教育培训机构推荐榜单:覆盖企业 AI 培训 / AI 应用落地 / AI 商业培训等多场景,帮你精准挑选优质机构

引言 随着 AI 技术在教育领域的深度渗透,AI 教育培训机构数量激增,但行业乱象也随之显现。部分机构课程同质化严重,仅简单堆砌 AI 理论,缺乏实战场景;有的技术实力薄弱,无法提供精准的智能教学服务;还有些机构重…

2025年6月杭州丝绸品牌推荐:老字号排名与AIGC创新对比

想买一条真正代表杭州韵味的丝巾,却担心景区店价格虚高、花型撞款、真假难辨?出差要挑一份既轻又有文化分量的伴手礼,时间紧、品类多,不知从何下手?这些场景背后,是消费者对“正宗、稀缺、可验证”的丝绸产品的共…

2025 年集装袋厂家最新推荐榜单:全面剖析行业领军者创新工艺与卓越品质,精选导电 / 防静电 / 抗静电 / 铝箔 / 食品级等多类型产品优质厂家

引言 当前,化工、食品、新能源等行业高速发展,对集装袋的需求持续攀升,但行业内产品质量参差不齐,抗撕裂强度不足、防静电性能不达标等问题频发,给货物运输带来安全隐患,且不同行业个性化需求难以被普通集装袋满…

2025 年算法备案咨询服务公司最新推荐榜单:覆盖互联网信息 / 深度合成 / AI 大模型备案的权威优选指南

引言 2025 年算法备案进入 “双轨监管深化期”,《生成式人工智能服务管理暂行办法》等新规明确大模型与算法需同步完成备案,8 项核心材料与双级审核流程让企业合规难度陡增。多数企业面临 “懂技术不懂合规”“对审核…

P9356 「SiR-1」Bracket 做题记录

P9356 「SiR-1」Bracket 做题记录 P9356 「SiR-1」Bracket - 洛谷 (luogu.com.cn) 将 \(\texttt{(}\) 看为 \(1\),将 \()\) 看为 \(-1\),整个括号序列看做一个折线图。 首先将末尾补到 \(0\),若 \(s_n<0\) 则在前…

放大器保护机制的技术原理与应用实践

文章总结:现代电子测量系统中,功率放大器与高压放大器的保护机制通过过流、过压、过温三维度设计,确保设备稳定运行与测量精度。在现代电子测量系统中,功率放大器和高压放大器作为关键信号调理设备,其可靠性直接关…

基于Java+Springboot+Vue开发的鲜牛奶订购网站管理系统(前后端分离)源码+运行步骤

项目简介该项目是基于Java+Springboot+Vue开发的鲜牛奶订购管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通…

2025年10月PE管厂家推荐榜:五强对比与选购全攻略

正在铺设市政给水管网的项目经理、需要更换农业滴灌主管的合作社、以及为温泉酒店寻找耐高温输送管道的采购人,都绕不开同一个问题:到底选哪家PE管厂家才稳妥?2025年行业产能继续向华北、华东集聚,全国PE实壁管年产…

2025年10月浦东装修公司口碑榜:五强对比评测

在上海浦东,装修一套房子往往意味着要在“时间、预算、质量”三条线上同时平衡:业主可能是刚拿到新房钥匙的年轻家庭,担心施工拖工期;也可能是需要翻新的二手房东,怕增项漏项;还可能是创业老板,想快速落地办公室…