字节码同步指令

Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor,更常见的是直接将它称为“锁”)来实现

同步一段指令集序列通常是由Java语言中的synchronized语句块来表示的,Java虚拟机的指令集中有monitorenter和monitorexit两条指令来支持synchronized关键字的语义,正确实现synchronized关键字需要Javac编译器与Java虚拟机两者共同协作支持。
示例代码:

public class Test {
    void onlyMe(Foo f) {
        synchronized (f) {
            doSomething();
        }
    }

    private void doSomething() {
    }

    static class Foo {

    }
}


用于分析Class文件字节码的工具:javap(-verbose参数)

字节码同步指令_第1张图片
编译器必须确保无论方法通过何种方式完成,无论方法是正常结束还是异常结束,方法中调用过的每条monitorenter指令都必须有其对应的monitorexit指令

从代码对应的字节码序列中可以看出,为了保证在方法异常完成时monitorenter和monitorexit指令依然可以正确配对执行,编译器会自动产生一个异常处理程序,这个异常处理程序声明可处理所有的异常,它的目的就是用来执行monitorexit指令。

你可能感兴趣的:(#,jvm,jvm,java)