@Monitor概念
Monitor概念
Java对象
以32位虚拟机为例
普通对象
|--------------------------------------------------------|
| object Header64 bits) |
|--------------------------------------------------------|
| Mark Word(32bits)| Klass Word(32bit |
|-----------------------------|--------------------------|
数组对象
|---------------------------------------------------------------|
| object Header(64bits) |
|----------------------------|----------------------------------|
| Mark Word(32 bits) | Klass Word(32bits) |
|----------------------------|--------------------------------- |
其中Mark Word结构为
|-------------------------------------------------------|--------------------|
| Mark Word (32 bits) | State |
|-------------------------------------------------------|--------------------|
| hashcode:25 | age:4 | biased_lock:0 | 01 | Normal |
|-------------------------------------------------------|--------------------|
| thread:23 | epoch:2 | age:4 | biased_lock:1 | 01 | Biased |
|-------------------------------------------------------|--------------------|
| ptr_to_lock_record:30 | 00 | Lightweight Locked |
|-------------------------------------------------------|--------------------|
| ptr_to_heavyweight_monitor:30 | 10 | Heavyweight Locked |
|-------------------------------------------------------|--------------------|
| | 11 | Marked for GC |
|-------------------------------------------------------|--------------------|
原理之Monitor(锁)
Monitor 被翻译为监视器或管程
每个Java对象都可以关联一个Mointor对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word中就被设置指向Monitor对象的指针
Monitor结构如下
- 刚开始Monitor中Owner为null
- 当Thread-2执行synchronized(obj)就会将Monitor的所有者Owner的所有者设置为Thread-2,Monitor中就只能有一个Owner
- 当Thread-2上锁的过程中,如果Thread-3,Thread-4,Thread-5也来执行synchronized(obj),就会进入EntryList BLOCKED
- 当Thread-2执行完同步代码块的内容,然后唤醒EntryList中等待的线程来竞争锁,竞争时非公平的
- 图中WaitSet中的Thread-0,Thread-1是之前获得过的锁,但条件不满足进入WAITING状态的线程
注意
- synchronized必须是进入同一个对象的Monitor才有上诉的效果
- 不加synchroized的对象是不会关联监视器,不遵从以上规则