moniter就是一个c++实现的对象,只有moniter对象的owner属性指向的线程才能执行被synchronized修饰的代码
moniter中的属性:
_owner:指向持有ObjectMonitor对象的线程
_WaitSet:存放处于wait状态的线程队列
_EntryList:存放处于等待锁block状态的线程队列
_recursions:锁的重入次数
_count:用来记录该线程获取锁的次数
当线程当问synchronized修饰的代码的时候会先进入entryList,当里面的线程发现owner为null就会去通过cas竞争对象锁,也就是将owner指针指向自己,同时将计数器加一,竞争失败就会进入waitSet,如果一个线程要重入的获取锁的话,会去查看moniter的owner指向的是不是自己,是的话就将计数器加一
moniter对象存储在堆中,MarkWord中保存了moniter的指针
Object的那几个方法其实最终调用的是objectMoniter里面的方法
