(4.5)Monitor实现重量级锁
4.5 Monitor (重量级锁)
Monitor被翻译为监视器或管程, 在Java中每个对象可以关联一个Monitor对象,Monitor是操作系统提供的、用于实现对象的加锁机制的角色。
使用Monitor(重量级锁)给synchronized对象加锁的过程:
- Java对象被加锁,则MarkDown中的ptr_to_heavyweight_monitor指针存储Monitor的地址
- Monitor中的Owner指向加锁对象,对象执行加锁代码
- 在Thread-2加锁过程中,如果有其他线程来获取锁对象时,发现MarkWord以及指向了Monitor,说明当前对象锁已被获取,所以进入EntryList变为Blocked状态
- Thread-2执行同步代码块之后,重置MarkWord为普通对象头的值(hashcode等),唤醒EntryList中等待的线程来竞争锁,是非公平竞争
- WaitSet中的线程是之前获取过锁,但因为等待其他线程所以进入waiting状态的线程