采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
如果对象的markword的指针,指向的就是对象关联的Monitor对象,那不同的对象可以关联不同的Monitor对象 如果执行类C有个同步方法, 类A的对象A要执行该方法,同时另一个线程中类B的对象B也要执行该方法,在对象A和B都用相同的C对象时,A和B 关联的是相同的Monitor对象
锁的底层实现依赖 Monitor:每个 Java 对象天生可关联一个 Monitor 对象。当使用synchronized对对象加锁(如重量级锁)时,对象头的 Mark Word 会被设置为指向 Monitor 对象的指针。此时,线程对锁的竞争本质是对 Monitor 所有权的争夺。例如,synchronized修饰代码块或方法时,底层通过monitorenter(获取 Monitor 锁)和monitorexit(释放 Monitor 锁)指令实现同步,方法同步则通过方法访问标志ACC_SYNCHRONIZED隐式获取 Monitor 锁。
synchronized
monitorenter
monitorexit
ACC_SYNCHRONIZED
Monitor 的状态控制锁行为:Monitor 内部有Owner(持有锁的线程)、EntryList(等待获取锁的线程队列)等结构。当线程获取锁时,会成为 Monitor 的Owner;若锁被占用,其他线程进入EntryList阻塞等待;锁释放时,Monitor 会唤醒EntryList中的线程重新竞争锁。
Owner
EntryList
对于类 C 的同步方法,若类 A 的对象 A 和类 B 的对象 B 使用相同的 C 对象调用该方法:
由于同一对象(C 对象)只关联一个 Monitor 对象,因此 A 和 B 线程竞争的是同一个 Monitor。此时,只有一个线程能获取 C 对象关联的 Monitor 锁,进入同步方法执行,另一个线程需在EntryList中等待,直到前一个线程释放锁(即 Monitor 的Owner变为空)。这种竞争关系体现了 Monitor 对锁语义的实现,即同一时刻仅允许一个线程持有锁(Monitor),保证同步方法的互斥执行。
登录后可查看更多问答,登录/注册
吃透并发编程,高效解决复杂问题,进入优秀工程师行列
475 5
430 3
383 2
442 2
330 2
购课补贴联系客服咨询优惠详情
慕课网APP您的移动学习伙伴
扫描二维码关注慕课网微信公众号