java的volatile关键字核心原理

本文探讨了Java和C/C++中volatile关键字的原理,指出Java volatile在字节码层面仅作标记,依赖C++的volatile实现内存可见性。C语言volatile防止编译器优化,确保每次读取都是最新的内存值。分析了Java中volatile的内存写回机制,并强调其并不提供实时同步保障。
摘要由CSDN通过智能技术生成

这篇文章是我的个人笔记,将就着看吧

 

(1)java使用volatile关键字,在字节码中只会标记ACC_VOLATILE,并不会额外生成字节码。本质上java使用的是C++的volatile  volatile实现内存可见性分析:字节码版本

(2)C++的volatile关键字,其实本质上就是在汇编代码上做了处理: C/C++ Volatile关键词深度剖

(3)C语言中volatile关键字的使用

 

1 java字节码层面


对以下代码进行反编译

private static volatile int num = 0;

private void increase() {
    num++;
}

得到

getstatic
iconst_1
iadd
putstatic
return

这五条指令,其中return是编译器自动加的

getstatic # 从static_field中读取num的值,放到栈顶
iconst_1 # 将常量1放到栈顶,num++本质上就是num = num + 1
iadd # 将栈顶的两个数相加,并将结果放回栈顶
putstatic # 将栈顶的数放入static_field

这里getstatic先拿到了num的值,但有可能其他的线程也同时getstatic。在putstatic时,两条线程设的都是无效值,所以volatile无法保证同步。对比看了一下没有使用volatile的字节码,好像没啥区别。使用了volatile的字节码中额外添加了ACC_VOLATILE标记

 

2 C++源码层面


通过sublime等工具全局搜索openj

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值