jvm基于进入和退出Monitor对象来实现方法同步和代码块同步,但是两者的实现方式不同,代码块同步是使用monitorenter和monitorexit指令实现的,而方法同步是使用另一种方法实现。但是方法同步同样可以用这两个指令来实现。
monitorenter指令是编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处或者异常处,jvm保证每一个monitorenter必须有对应的monitorexit与之对应。
任何对象都有一个monitor与之关联,而且一个monitor被持有后,他将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象的对应的monitor所有权,即尝试获得对象的锁