为什么调用方法的Java字节码隐式获取和释放监视器?

tem*_*def 15 java jvm synchronized

我一直在阅读Java虚拟机指令集,并注意到当使用指令调用标记为同步的方法(例如invokestatic,invokevirtual等)时,由特定的字节码指令来获取接收器上的监视器宾语.类似地,从方法返回时,由方法同步时指令释放监视器的指令.这看起来很奇怪,因为有明确的monitorenter和monitorexit字节码来管理监视器.JVM是否有特殊原因以这种方式设计这些指令,而不是仅仅编译方法以包含适当的monitorenter和monitorexit指令?

Tom*_*ine 4

早在 90 年代中期,还没有 Java JIT 编译器,微同步被认为是一个非常好的主意。

所以你经常调用这些同步方法。甚至Vector还有它们!您无需解释额外的字节码即可处理。

但不仅仅是在代码运行时。类文件更大。额外的说明,还要设置try/finally表并验证是否有一些顽皮的东西没有被溜进去。

只是我的猜测。