96SEO 2026-02-19 17:41 12
定的易挥发的在Java中代表变量修饰符用来修饰会被不同线程访问和修改的变量对于方法代码块方法参数局部变量以及实例常量类常量多不能进行修饰。

自JDK1.5之后官网对volatile进行了语义增强这让它在Java多线程领域越发重要因此我们今天就抽一晚上时间来学一学这个关键字首先我们从标题入手思考这样的一个问题
volatile是如何保证可见性的又是如何禁止指令重排的它为什么不能实现原子性呢
带着疑问我们一起走进volatile的世界探索它与可见性有序性原子性之间的爱恨情仇
volatile保证了不同线程对共享变量进行操作时的可见性即一个线程修改了共享变量的值共享变量修改后的值对其他线程立即可见。
我们会发现线程1运行起来后休眠1秒启动线程2可即便线程2把stop设置为true了线程1仍然没有停止这个就是因为
那这个问题怎么解决呢很好解决我们排volatile上场可以秒搞定只需要给stop变量加上volatile修饰符即可
终止从结果中看线程1成功的读取到了线程而设置为true的stop变量值解决了可见性问题。
那volatile到底是什么让变量在多个线程之间保持可见性的呢请看下图
JVM这个变量是共享且不稳定的每次使用它都到主存中进行读取具体实现可总结为5步。
1️⃣在生成最低成汇编指令时对volatile修饰的共享变量写操作增加Lock前缀指令Lock
变量通过缓存一致性协议保证每个线程获得最新值4️⃣缓存一致性协议保证每个
通过嗅探在总线上传播的数据来检查自己缓存的值是不是修改5️⃣当
在之前的学习我们了解到为了充分利用缓存提高程序的执行速度编译器在底层执行的时候会进行指令重排序的优化操作但这种优化在有些时候会带来
那何为有序性呢我们可以通俗理解为程序执行的顺序要按照代码的先后顺序。
当然之前我们还说过发生有序性问题时我们可以通过给变量添加volatile修饰符进行解决。
b;(3)上面的这段代码中c变量依赖ab的值因此在编译器优化重排时c肯定会在ab赋值以后执行但ab之间没有依赖关系可能会发生重排序但这种重排序即便到了多线程中依旧不会存在问题因为即便重排对执行结果也无影响。
但有些时候指令重排序可以保证串行语义一致但是没有义务保证多线程间的语义也一致我们继续看下面这段代码
(!Thread.currentThread().isInterrupted())
num);//(2)}System.out.println(读取线程...);}}}public
true;//(4)System.out.println(赋值线程...);}}public
ReadThread();rt.start();WriteRead
WriteRead();wr.start();Thread.sleep(10);rt.interrupt();System.out.println(rt
}我们定义了2个线程一个用来求和操作一个用来赋值操作因为定义的是成员变量所以代码1234之间不存在依赖关系在运行时极可能发生指令重排序如将4在3前执行顺序为4132这时输出的就是0而不是4但在很多性能比较好的电脑上这种重排序情况不易复现。
变量的读一个线程内按照程序代码顺序书写在前面的操作先行发生于书写在后面的操作happens-before
变量的写操作在变量的前面和后面分别插入内存屏障volatile
OK知道了这些内容之后我们再回头看代码示例2中增加了volatile关键字后的执行顺序在赋值线程启动后执行顺序会变成3412这时打印的结果就为4啦
我们讲完了volatile修饰符保证可见性与有序性的内容接下来我们思考另外一个问题它能够保证原子性吗为什么我们依旧通过一段代码去证明一下
{count;}System.out.println(thread
{count;}System.out.println(thread
}我们创建了2个线程分别对count进行加10000操作理论上最终输出的结果应该是20000万对吧但实际并不是我们看一下真实输出。
1。
这种情况多发生在cpu占用时间较长的线程中若单线程对count仅增加100那我们就很难遇到线程的切换得出的结果也就是200啦。
synchronized、Lock或者AtomicInteger都可以我们在后面的文章中会聊到的请继续保持关注哦
如果本篇博客对您有一定的帮助大家记得留言点赞收藏呀。
原创不易转载请联系Build哥
如果您想与Build哥的关系更近一步还可以关注“JavaBuild888”在这里除了看到《Java成长计划》系列博文还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等等欢迎您的加入
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback