以下截图及相关信息,均来源于马士兵公开课中
Synchronized 实现过程:
Java代码层面:添加 synchronized 关键字
Java字节码层面:监视器 moniterenter 、 moniterexit
执行过程中自动升级
lock comxchg
Synchronized 最底层实现
JIT (Just In Time Compiler ) 即时编译
首先了解一下 JVM 的即时编译,对于热点代码直接编译成机器语言,提高效率。
JIT 会把热点代码编译成汇编语言
public class T2 {
public static void main(String[] args) {
for (int i = 0; i < 1000000; i++) {
m();
n();
}
}
public static synchronized void m(){
}
public static void n(){
}
}
m() , n() 执行了一百万次,所以这两个方法在这个程序中就叫热点代码,把热点代码进行即时编译,编译成机器语言,到第10次编译成机器语言了,可能到第11次执行的时候就不再重新解释了,就直接执行了,效率会高很多。
通过命令查看:
java -XX:+UnlockDiagnosticVMOptions -XX:PrintAssembly T2
C1 Compile Level 1 (一级优化)
C2 Compile Level 2 (二级优化)
JIT 会把 m(),n() 编译成汇编码,会看到 lock comxchg ....指令。