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里面的方法
    image.png