volatile

 

CAS实现的原理是调用Unsafe类 而Unsafe实现类实现的代码 是调用本地的native 方法实现的

最终经过查找openjdk发现是c++对应的Atomic::cmpxchg实现了对应的功能

意思是Atomic类的cmpxchg成员函数

        

 

jint 是返回值 java自定义的类型修饰符,可以简单认为就是int

inline内联修饰符 建议编译器在调用该代码时是插入该代码 而不是调用函数,具体是否内联看编译器的实现 这个做法是空间换取时间的优化方案

宏可以简单的认为一个预先已经定义的操作 可以是常量 字符串 数字,在编译的时候 就会替换成真正的类型

__asm__ 这个宏 代表内嵌汇编 跟内联函数类似,意味着可以在gcc编译器直接将该内容编译成原始的编译指令

可以看到lock_if_mp这个宏中 定义了当为多核处理器的时候 会自动加lock指令,

在 Pentium 和早期的 IA-32 处理器中 lock指令通常是做法是锁住系统总线,来达到数据的准确性,但是会影响计算机执行效率,现代操作系统和处理器 一般都是 基于 缓存一致性协议(MESI) 和嗅探功能 实现多核操作系统  处理器 加载的L1,L2等等高速缓冲器 和内存的数值不一致的问题. 

 

java中的volatile对应c|c++的volatile关键字 这个指令的特性,

易变性:下一条语句不会直接使用上一条语句对应的volatile变量的寄存器内容,而是重新从内存中读取。

不可优化性:。volatile告诉编译器,不要对我这个变量进行各种激进的优化,甚至将变量直接消除,很难保证程序员写在代码中的指令,一定会被执行。

还有 更多其他深入的原则 内存屏障,happens-before就很难一言讲清楚,可以自己查查c++实现这个关键词的技术,或者直接研究gcc编译器的实现原理 查看gcc实现编译该关键字的汇编代码 等等操作 使用volatile 关键字实现的c c++代码是不会加lock指令的.

 

实验 vs2019 Release版本 注意是Release版本 不是debug版本 debug版本 默认没有开编译优化 需要自己调出来

 

 

 

可以看到 gcc编译器优化的反汇编代码非常简单 直接往栈中push 4,3,2,1这几个 数字 就call调用了

 

 

 

可以看到 加了volatile关键字的代码 并没有触发 gcc编译器的优化,而是先分配a,b,c,d的内存值,将内存值先读入eax寄存器中,在将eax的值放入到栈中,依次操作这几个值,最后在调的call方法.

 

由此就可以看出volatile关键字实现的部分原理,禁用编译器优化

 

所以说volatile关键字 在多线程编程环境下 确保变量的最新 原则上最好还是在合适的地方加上,因为会影响效率,如果不熟悉volatile 建议慎用 影响程序编译优化.

 

想要了解更多底层细节的话 推荐学习计算机组成原理,操作系统 这两本书 并且学习一定的c|c++基础和汇编基础

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值