volatile底层实现原理
来源:互联网 发布:有毒网络剧 编辑:程序博客网 时间:2024/05/16 05:34
定义
java编程语言允许线程访问共享变量,为了确保共享变量能够被准确和一致的更新,线程应该通过排他锁获得这个变量。java提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到的这个变量的值是一致的。
汇编代码
使用命令获得汇编代码
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssemblyJava HotSpot(TM) 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional outputLoaded disassembler from /Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/jre/lib/hsdis-amd64.dylibDecoding compiled method 0x0000000110da4b50:Code:[Disassembling for mach='i386:x86-64'][Entry Point][Constants] # {method} {0x000000010f163000} 'hashCode' '()I' in 'java/lang/String' # [sp+0x40] (sp of caller) 0x0000000110da4cc0: mov 0x8(%rsi),%r10d 0x0000000110da4cc4: shl $0x3,%r10 0x0000000110da4cc8: cmp %rax,%r10 0x0000000110da4ccb: jne 0x0000000110ceae20 ; {runtime_call} 0x0000000110da4cd1: data32 data32 nopw 0x0(%rax,%rax,1) 0x0000000110da4cdc: data32 data32 xchg %ax,%ax[Verified Entry Point] 0x0000000110da4ce0: mov %eax,-0x14000(%rsp) 0x0000000110da4ce7: push %rbp 0x0000000110da4ce8: sub $0x30,%rsp ......
mac系统下使用此命令的前提是下载hsdis-amd64.dylib,并将其放入到jdk的jre下的lib目录下
实现原理
通过利用工具获得class文件的汇编代码,会发现,标有volatile的变量在进行写操作时,会在前面加上lock质量前缀。
而lock指令前缀会做如下两件事
将当前处理器缓存行的数据写回到内存。lock指令前缀在执行指令的期间,会产生一个lock信号,lock信号会保证在该信号期间会独占任何共享内存。lock信号一般不锁总线,而是锁缓存。因为锁总线的开销会很大。
将缓存行的数据写回到内存的操作会使得其他CPU缓存了该地址的数据无效。
阅读全文
0 0
- volatile底层实现原理
- volatile底层原理
- Java并发机制底层——Volatile的实现原理
- volatile底层实现
- Java中Volatile底层原理与应用
- Java中Volatile底层原理与应用
- Java中Volatile底层原理与应用
- Struts2底层实现原理
- 底层Ajax实现原理
- block底层实现原理
- SDWebImage底层实现原理
- KVO底层实现原理
- KVO底层实现原理
- SDWebImage底层实现原理
- HashMap底层实现原理
- HashMap底层实现原理
- KVO底层实现原理
- synchronized底层实现原理
- Lambda表达式
- LIS最长上升子序列(打印路径)
- petalinux查看xadc 温度
- leetcode(11) Container With Most Water
- iOS 热点 拨打电话 适配
- volatile底层实现原理
- 软件开发 —— 重构(refactor)
- PAT A1099
- go语言开发环境搭建
- 给messageCheckBox 赋值
- 杨辉三角两种输出结果
- 数据结构 BFS层次遍历二叉树【C语言版本】
- 斯坦福大学机器学习课程线性回归编程作业二(多变量2)
- hibernate加载策略之lazy