探究 synchronized
和 Monitor
的关系。
Monitor
被翻译成监视器或者管程。
每个 Java
对象都可以关联一个 Monitor
对象,如果使用 synchronized
给对象上锁(重量级)之后,该对象头 Mark Word
中就会被设置只想 Monitor
对象的指针。
Monitor
结构
Monitor
是操作系统的对象,开始的时候,Monitor
的Owner
是null
- 当
Thread-1
执行synchronized(obj)
将会把Monitor
所有者owner
设置为Thread-1
,Monitor
中只有一个Owner
- 当
Thread-1
上锁后,如果Thread-3
、Thread-4
也来执行synchronized(obj)
,机会进入到EntryList blocked
- 当
Thread-1
执行完同步代码块的内容,然后唤醒EntryList
中等待的线程来竞争锁,竞争时是非公平的 Thread-5
、Thread-6
是之前已经获得过锁的线程,但条件不满足进入 waiting 状态的线程
注意
synchronized
必须是进入同一个对象的Monitor
才有上述效果- 注意上述是重量级锁的过程