Java volatile 关键字
1. 被 volatile 变量修饰后特点有序性 和 可见性volatile 的内存语义写一个 volatile 变量时 JMM 会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个 volatile 变量时JMM 会把该线程对应的本地内存设置为无效直接从主内存中读取共享变量。所以 volatile 的写内存语义是直接刷新到主内存中读的内存语义是直接从主内存中读取。2. 内存屏障2.1 是什么内存屏障也称内存栅栏内存栅障屏障指令等是一类同步屏障指令是 CPU 或编译器在对内存随机访问的操作中的一个同步点使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作避免代码重排序。内存屏障其实就是一种 JVM 指令Java内存模型的重排规则会要求Java编译器在生成JVM指令时插入特定的内存屏障指令通过这些内存屏障指令volatile 实现了 Java内存模型中的可见性和有序性但volatile 无法保证原子性。内存屏障之前的所有写操作都要回写到主内存内存屏障之后的所有读操作都能获得内存屏障之前的所有写操作的最新结果(实现了可见性)。因此重排序时不允许把内存屏障之后的指令重排序到内存屏障之前。一句话对一个 volatile 域的写, happens-before 于任意后续对这个 volatile 域的读也叫写后读。2.2 volatile 凭什么可以保证可见性和有序性直接读写主内存 内存屏障强制刷新内存屏障禁止指令重排序2.3 JVM 提供了四种内存屏障指令在每一个 volatile 写操作前面插入一个 StoreStore 内存屏障在每一个 volatile 写操作后面插入一个 StoreLoad 内存屏障在每一个 volatile 读操作前面插入一个 LoadLoad 内存屏障在每一个 volatile 读操作后面插入一个 LoadStore 内存屏障3. volatile 特性3.1 可见性保证不同线程对这个变量进行操作时的可见性即变量一旦改变所有线程立即可见。代码演示publicclassVolatileSeeDemo{staticbooleanflagtrue;//不加volatile没有可见性//static volatile boolean flag true; //加了volatile保证可见性publicstaticvoidmain(String[]args){newThread(()-{System.out.println(Thread.currentThread().getName()\t come in);while(flag){}System.out.println(Thread.currentThread().getName()\t flag被修改为false,退出.....);},t1).start();//暂停2秒钟后让main线程修改flag值try{TimeUnit.SECONDS.sleep(2);}catch(InterruptedExceptione){e.printStackTrace();}flagfalse;System.out.println(main线程修改完成);}}解决使用 volatile 修饰共享变量就可以达到上面的效果被 volatile 修改的变量有以下特点线程中读取的时候每次读取都会去主内存中读取共享变量最新的值然后将其复制到工作内存线程中修改了工作内存中变量的副本修改之后会立即刷新到主内存3.2 有序性volatile 关键字通过内存屏障Memory Barrier和happens-before规则来保证有序性具体实现如下编译器和处理器会对指令进行重排序以优化性能但在多线程环境下可能导致不可预期的结果。volatile 变量的读写操作会插入内存屏障禁止特定类型的重排序写操作Store在 volatile 写操作前插入 StoreStore 屏障确保所有普通写操作非 volatile在此之前完成。在 volatile 写操作后插入 StoreLoad 屏障防止 volatile 写与后续的 volatile 读/写重排序。读操作Load在 volatile 读操作后插入 LoadLoad 屏障和 LoadStore 屏障确保后续操作不会重排到 volatile 读之前。happen-before 规则根据 JMMJava 内存模型的 happens-before 原则- 写操作先行于读操作对 volatile 变量的写操作 happens-before 后续所有对该变量的读操作。 - 编译器/处理器必须遵守此规则不会破坏这种顺序性。volatile 通过内存屏障限制指令重排序结合happens-before 规则和强制主内存访问确保多线程环境下对变量的操作按预期顺序执行从而保证有序性。3.3 不保证原子性奥volatile 变量的复合操作如 i 不具有原子性。在 JVM 字节码 i 操作分为三步数据加载 数据计算 数据赋值间隙期不同步非原子操作。4. 如何正确使用 volatile单一赋值可以 复合赋值不可以状态标志判断业务是否结束开销较低的读 写策略双端锁5. 总结5.1 内存屏障是什么是 一 种 屏 障 指 令它使得 CPU 或 编译器 对屏障指令的前和后 所发出的内存操作 执行一个排序的约束。5.2 内存屏障能干嘛5.3 内存屏障四大指令在每一个 volatile 写操作前面插入一个 StoreStore 内存屏障在每一个 volatile 写操作后面插入一个 StoreLoad 内存屏障在每一个 volatile 读操作前面插入一个 LoadLoad 内存屏障在每一个 volatile 读操作后面插入一个 LoadStore 内存屏障

相关新闻

GitHub Desktop日常开发与代码合并实操:从克隆到冲突解决全流程

GitHub Desktop日常开发与代码合并实操:从克隆到冲突解决全流程

直接上手说吧。GitHub Desktop是我这两年主力用的Git客户端,日常开发、分支管理、代码合并全在这上面完成。团队里有人质疑“用GUI是不是不够专业”,但我实际用下来,只要把工作流理顺,GitHub Desktop的效率和安全性完全不输命令行…

2026/10/9 2:54:48 阅读更多 →
基于 PaddleCV 新增推理算子:三类算子体系、数据契约与完整实现指南

基于 PaddleCV 新增推理算子:三类算子体系、数据契约与完整实现指南

人工智能深度学习计算机视觉NLP语音 【免费下载链接】models Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on. 项目地址: https://gitcode.com/gh_mirrors/mo/models 点击查看 免费下载 PaddleCV 是…

2026/10/9 2:54:48 阅读更多 →
Unison 命名空间详情 API 实战:基于 transcript 测试文档解析 `namespaces` 端点的请求与响应

Unison 命名空间详情 API 实战:基于 transcript 测试文档解析 `namespaces` 端点的请求与响应

编程语言编译器语言运行时开发工具 【免费下载链接】unison A friendly programming language from the future 项目地址: https://gitcode.com/gh_mirrors/un/unison 点击查看 免费下载 本文以当前仓库中 api-namespace-details.md 这一 UCM(Unison Co…

2026/10/9 2:53:47 阅读更多 →

最新新闻

JavaWeb在线问卷调查系统课程设计:结构部署与核心代码解析

JavaWeb在线问卷调查系统课程设计:结构部署与核心代码解析

简介:基于JavaWeb的在线问卷调查系统课程设计源码包,面向需要完成Java课设、毕设或学习Servlet/JSP与Spring Boot整合开发的学生和开发者。系统覆盖用户注册登录、问卷创建与填写、管理员统一管理、多题型支持(单选、多选、文本题&#xff09…

2026/10/9 4:00:29 阅读更多 →
JavaWeb在线问卷调查系统:从建表到统计的完整实践

JavaWeb在线问卷调查系统:从建表到统计的完整实践

简介:这是一份基于JavaWeb的在线问卷调查系统课程设计源码包,涵盖前后端完整工程与数据库脚本,面向需要完成Java课设或学习Spring Boot、ServletJSP项目的开发者。系统实现用户注册登录、问卷创建与填写、单选题多选题文本题、发布暂停结束、…

2026/10/9 4:00:29 阅读更多 →
PyYAML实战指南:从配置文件解析到安全加载与避坑

PyYAML实战指南:从配置文件解析到安全加载与避坑

作为一个天天跟配置文件打交道的 Python 开发者,我可以直接告诉你:PyYAML 是那种你用一次就再也离不开的库。项目里无论是 CI/CD 流水线参数、爬虫的抓取规则、深度学习模型的超参数,还是后端服务的路由配置,用 YAML 写出来就是比…

2026/10/9 4:00:29 阅读更多 →
基于微信小程序的心理健康咨询系统设计与实现

基于微信小程序的心理健康咨询系统设计与实现

搞过计算机毕业设计的人都知道,选题是整个环节里最要命的一步。选个图书管理系统、学生选课系统这类,答辩老师看一眼就翻页,因为千篇一律到没有记忆点;选个算法题,工作量又很难撑起一篇合格的毕业论文,代码…

2026/10/9 4:00:29 阅读更多 →
全球开源发展愿景论坛:从议程拆解到参会议题指南

全球开源发展愿景论坛:从议程拆解到参会议题指南

看到这届“全球开源发展愿景论坛”的议程表正式发布,我第一反应是:这个论坛是真的想把“开源无界,共筑未来”从口号变成可讨论、可落地的议题集合。前几年大家聊开源,更多还是盯着代码仓库、许可证、社区PR,但今年这份…

2026/10/9 4:00:29 阅读更多 →
基于EasyHook的.NET虚拟文件系统:从API Hook到路径重定向实战

基于EasyHook的.NET虚拟文件系统:从API Hook到路径重定向实战

简介:这是一份基于 .NET 与 EasyHook 的虚拟文件系统完整源码,面向熟悉 C#、希望深入理解 Windows 文件操作 Hook 机制的开发者。项目通过拦截 FindFirstFileW、FindNextFileW、CreateFileW 等关键 API,实现文件查找、创建等行为的监控与自定…

2026/10/9 3:59:28 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 10:10:36 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →