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

示例代码

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指令配合做到加锁和释放锁的操作。

发布了222 篇原创文章 · 获赞 224 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104578641