这篇文章是我的个人笔记,将就着看吧
(1)java使用volatile关键字,在字节码中只会标记ACC_VOLATILE,并不会额外生成字节码。本质上java使用的是C++的volatile volatile实现内存可见性分析:字节码版本
(2)C++的volatile关键字,其实本质上就是在汇编代码上做了处理: C/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