登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
1
2
/ 2 页
下一页
返回列表
首页
›
业界区
›
业界
›
Java源码分析系列笔记-3.volatile
Java源码分析系列笔记-3.volatile
[ 复制链接 ]
臧莞然
2025-6-22 17:46:15
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
目录
1. 是什么
2. 什么情况 volatile 比 synchronized 更合适
2.1. 例子
2.2. 无法停止的原因分析
2.3. 解决方法
2.4. volatile vs synchronized
3. 汇编源码实验
3.1. 下载编译 hsdis-amd64.dll
3.2. 放入 JRE bin 目录下
3.3. 对比实验
3.4. 加上 jvm 参数运行
3.5. 输出结果对比
4. 根据实验结果分析原理
4.1. 可见性
4.2. 有序性
5. 参考
1. 是什么
Java 的轻量级锁,主要保证了有序性、可见性和一定的原子性
轻量级
相比于 synchronized,volatile 不会引起上下文切换(不会造成线程阻塞)
原子性
对任意单个 volatile 变量的读/写具有原子性,但类似于 volatile++这种复合操作不具有原子性
可见性
volatile 写会把数据同时写入主内存,并让其他线程对这个数据的工作内存失效,这样其他线程读的时候就需要去主内存中读取
有序性
对一个 volatile 变量的读,总是能看到(任意线程)对这个 volatile 变量最后的写入。
2. 什么情况 volatile 比 synchronized 更合适
2.1. 例子
如下程序。thread1 并不会停止
public class VolatileTest
{
private static boolean isRunning = true;
public static void main(String[] args) throws InterruptedException
{
Thread thread1 = new Thread(()->{
System.out.println("thread1 is running");
while (isRunning)
{
}
System.out.println("thread1 will be stopped");
});
thread1.start();
Thread.sleep(1000);
Thread thread2 = new Thread(()->{
System.out.println("thread2 is running");
isRunning = false;
System.out.println("thread2 change isRunning flag");
});
thread2.start();
thread1.join();
thread2.join();
}
}
复制代码
2.2. 无法停止的原因分析
Thread1 从主内存把 isRunning 这个变量加载到工作内存中,值为 true 所以一直运行
Thread2 从主内存把 isRunning 这个变量加载到工作内存中,值为 true 改为 false,写回工作内存,再写回主内存
Thread1 一直从工作内存中读取这个变量,一直为 true,所以还是无法停止运行
2.3. 解决方法
将 isRunning 使用 volatile 修饰
public class VolatileTest
{
private static volatile boolean isRunning = true;
public static void main(String[] args) throws InterruptedException
{
Thread thread1 = new Thread(()->{
System.out.println("thread1 is running");
while (isRunning)
{
}
System.out.println("thread1 will be stopped");
});
thread1.start();
Thread.sleep(1000);
Thread thread2 = new Thread(()->{
System.out.println("thread2 is running");
isRunning = false;
System.out.println("thread2 change isRunning flag");
});
thread2.start();
thread1.join();
thread2.join();
}
}
复制代码
2.4. volatile vs synchronized
volatilesynchronized内存模型三性可见性、有序性可见性、有序性、原子性是否造成线程阻塞【重量级别】不会会应用范围变量级别变量、方法、类级别
3. 汇编源码实验
3.1. 下载编译 hsdis-amd64.dll
参考How to build hsdis-amd64.dll and hsdis-i386.dll on Windows或者hsdis-amd64.7z
3.2. 放入 JRE bin 目录下
3.3. 对比实验
有 volatile
public class TestVolatile
{
private static volatile int i = 0;
public static void main(String[] args)
{
test();
}
private static void test()
{
i++;
}
}
复制代码
没有 volatile
public class TestVolatile
{
private static int i = 0;
public static void main(String[] args)
{
test();
}
private static void test()
{
i++;
}
}
复制代码
3.4. 加上 jvm 参数运行
-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:-Inline -XX:CompileCommand=print,*TestVolatile.test
复制代码
使用 IDEA 的话如下图:
3.5. 输出结果对比
结果如附件:
volatile.txt
普通.txt
使用 BeyondCompare 对比图如下:
4. 根据实验结果分析原理
从汇编语言层面看,有 volatile 的结果比没有 volatile 的多了一个指令:lock addl $0x0,(%rsp) ,这条指令起到内存屏障的作用
禁止屏障两边的指令重排序
强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效
4.1. 可见性
根据内存屏障的作用 2 可以实现可见性,表现如下
volatile 写会把数据同时写入主内存,并让其他线程对这个数据的工作内存失效
其他线程 volatile 读的时候就需要去主内存中读取
4.2. 有序性
根据内存屏障的作用 1 可以实现有序性,表现如下
在 volatile 写之前插入
释放屏障
【LoadStore+StoreStore】使得该屏障之前的任何读写操作都先于这个 volatile 写被提交;
在 volatile 读之后插入
获取屏障
【LoadLoad+LoadStore】使得这个 volatile 读操作先于该屏障之后的任何读写操作被提交。
5. 参考
深入理解 Java 内存模型(四)——volatile-InfoQ
再有人问你 volatile 是什么,把这篇文章也发给他。-HollisChuang's Blog
Java volatile 关键字底层实现原理解析 - 王泽远的博客 | Crow's Blog
精确解释 java 的 volatile 之可见性、原子性、有序性(通过汇编语言) - tantexian 的博客空间 - OSCHINA
volatile 与 synchronized 的区别 - 掘金
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
Java
源码
分析
系列
笔记
相关帖子
openclaw平替之nanobot源码解析(六):子智能体(Subagents)
[AI应用框架/Java] Spring AI 应用开发指南
Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)
记一次Webshell流量分析 | 添柴不加火
Spring IOC 源码学习 事务增强相关的对象创建
openclaw平替之nanobot源码解析(八):Gateway进阶——定时任务与心跳机制
openclaw平替之nanobot源码解析(七):Gateway与多渠道集成
Java 26 发布了, 我人麻了。。
JAVA找出哪个类import了不存在的类
JAVA找出哪个类import了不存在的类
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
openclaw平替之nanobot源码解析(六):子智能体(Subagents)
0
747
艾曼语
2026-03-19
业界
[AI应用框架/Java] Spring AI 应用开发指南
0
15
阮蓄
2026-03-20
业界
Spring IOC 源码学习 事务相关的 BeanDefinition 解析过程 (XML)
0
514
东门芳洲
2026-03-21
业界
记一次Webshell流量分析 | 添柴不加火
0
168
崔瑜然
2026-03-22
安全
Spring IOC 源码学习 事务增强相关的对象创建
0
794
辈霖利
2026-03-23
安全
openclaw平替之nanobot源码解析(八):Gateway进阶——定时任务与心跳机制
0
816
啪炽
2026-03-23
业界
openclaw平替之nanobot源码解析(七):Gateway与多渠道集成
0
335
胁冉右
2026-03-23
安全
Java 26 发布了, 我人麻了。。
0
690
窖咎
2026-03-24
业界
JAVA找出哪个类import了不存在的类
0
614
茅断卉
2026-03-24
业界
JAVA找出哪个类import了不存在的类
0
364
杓疠?
2026-03-24
回复
(31)
高小雨
2025-10-18 01:13:06
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
前排留名,哈哈哈
骆熙华
2025-11-25 16:07:01
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
yyds。多谢分享
汤流婉
2025-11-27 04:50:43
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
感谢分享,学习下。
靳夏萱
2025-12-18 03:41:26
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
鼓励转贴优秀软件安全工具和文档!
瞧蛀
2025-12-18 08:43:44
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
存叭
2025-12-18 16:06:03
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
前排留名,哈哈哈
邹语彤
2025-12-25 23:17:20
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
簑威龙
2025-12-30 14:16:19
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
谢谢分享,试用一下
梳踟希
2026-1-11 04:05:45
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
谢谢楼主提供!
命煦砌
2026-1-18 06:46:56
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
收藏一下 不知道什么时候能用到
许娴广
2026-1-18 07:04:58
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
东西不错很实用谢谢分享
挠溃症
2026-1-20 14:28:58
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
前排留名,哈哈哈
艾晓梅
2026-1-21 10:38:58
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
不错,里面软件多更新就更好了
懵崭
2026-1-22 22:00:24
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
鼓励转贴优秀软件安全工具和文档!
赖珊
2026-1-23 03:31:55
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个有用。
圣罩
2026-1-26 12:28:25
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
不错,里面软件多更新就更好了
敞撬
2026-2-3 06:35:23
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
这个有用。
胁冉右
2026-2-3 07:20:07
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
yyds。多谢分享
敞撬
2026-2-5 10:39:37
回复
使用道具
举报
照妖镜
程序园永久vip申请,无限下载程序园所有程序/软件/数据/等
这个好,看起来很实用
下一页 »
1
2
/ 2 页
下一页
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
臧莞然
2026-2-5 10:39:37
关注
0
粉丝关注
20
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991125
anyue1937
9994892
kk14977
6845359
4
xiangqian
638210
5
神泱
9522
6
韶又彤
9916
7
宋子
9878
8
荪俗
9016
9
闰咄阅
9995
10
刎唇
9995
查看更多
今日好文热榜
619
团结引擎发布小游戏与js版本SDK的互相调用
31
团结引擎发布小游戏与js版本SDK的互相调用
546
团结引擎发布小游戏与js版本SDK的互相调用
0
团结引擎发布小游戏与js版本SDK的互相调用
428
不用装软件!这款MicroPython浏览器 IDE :
854
MySQL备份恢复全攻略:mysqldump与xtraback
517
等保2.0三级要求下Redis 安全测评应该怎么
845
vue甘特图vxe-gantt如何设置日期轴显示为周
807
从付费软件到自主开发:我用AI和FFmpeg实现
275
面试一问就给我整不会了如何跨标签页通信
959
单调队列优化多重背包 学习笔记 & 详解
480
OpenClaw+优云智算Coding Plan:从灵感到成
868
net C# 如何理解和实现 Dispose 方法
840
归并排序力扣题(leetcode)
403
龙芯2k0300 - 走马观碑组ST7735驱动移植
985
大模型智能体 (agent)简易流程介绍
521
3.Langchain 1.2.0 学习 --- LCEL和Runnabl
289
搭建产品原型
978
AI Coding 实战:10年祖传系统,54万行代码
396
微信对接OpenClaw的常见问题和解决方案