简单了解下Synchronized加锁和释放锁的JVM指令

允我心安 提交于 2020-03-01 12:58:24

示例代码

public class TestMain {
    private Object lock = new Object();
    public void get() {
        synchronized (lock) {
            System.out.println("get");
        }
    }
}

通过javap命令把TestMain的字节码文件反编译成JVM指令

javap -verbose TestMain.class 

部分结果如下:

在这里插入图片描述

这里monitorexit有两个是因为线程出现异常后也会释放锁,所以monitorexit的数量会比monitorenter的数量多,无需一一对应,入口只能有一个,这是为了同步,出口可以有多个,这是为了尽量保证在不同情况下,锁都能够被顺利释放。

总结

这篇文章主要就是看下Synchronized加锁和释放锁的JVM指令是什么样的,具体细节没有做深入,可以发现
Synchronized靠的是monitorenter和monitorexit两个JVM指令配合做到加锁和释放锁的操作。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!