示例代码
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指令配合做到加锁和释放锁的操作。
来源:CSDN
作者:绅士jiejie
链接:https://blog.csdn.net/weixin_38106322/article/details/104578641