请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Monitor对象和锁有关系吗

如果对象的markword的指针,指向的就是对象关联的Monitor对象,那不同的对象可以关联不同的Monitor对象
如果执行类C有个同步方法, 类A的对象A要执行该方法,同时另一个线程中类B的对象B也要执行该方法,在对象A和B都用相同的C对象时,A和B 关联的是相同的Monitor对象

正在回答 回答被采纳积分+3

1回答

Alfred_li 2025-04-18 23:53:30
  • 锁的底层实现依赖 Monitor:每个 Java 对象天生可关联一个 Monitor 对象。当使用synchronized对对象加锁(如重量级锁)时,对象头的 Mark Word 会被设置为指向 Monitor 对象的指针。此时,线程对锁的竞争本质是对 Monitor 所有权的争夺。例如,synchronized修饰代码块或方法时,底层通过monitorenter(获取 Monitor 锁)和monitorexit(释放 Monitor 锁)指令实现同步,方法同步则通过方法访问标志ACC_SYNCHRONIZED隐式获取 Monitor 锁。

  • Monitor 的状态控制锁行为:Monitor 内部有Owner(持有锁的线程)、EntryList(等待获取锁的线程队列)等结构。当线程获取锁时,会成为 Monitor 的Owner;若锁被占用,其他线程进入EntryList阻塞等待;锁释放时,Monitor 会唤醒EntryList中的线程重新竞争锁。

二、结合实例分析

对于类 C 的同步方法,若类 A 的对象 A 和类 B 的对象 B 使用相同的 C 对象调用该方法:


  • 由于同一对象(C 对象)只关联一个 Monitor 对象,因此 A 和 B 线程竞争的是同一个 Monitor。此时,只有一个线程能获取 C 对象关联的 Monitor 锁,进入同步方法执行,另一个线程需在EntryList中等待,直到前一个线程释放锁(即 Monitor 的Owner变为空)。这种竞争关系体现了 Monitor 对锁语义的实现,即同一时刻仅允许一个线程持有锁(Monitor),保证同步方法的互斥执行。


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号