JAVA对象头
以32位虚拟机为例
普通对象
每个对象都有一个类型,由Klass Word指向它的类型
数组对象
其中Mark Word的结构为
Monitor(锁)
Monitor被翻译为监视器或管程
每个Java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后,该对象头的Mark Word中就被设置指向Monitor对象的指针
例
obj是java提供的对象,monitor是操作系统提供的
刚开始Monitor中的Owner为null
当Thread-2被加上重量级锁的时候,他Mark Word的内容发生改变,他就会找到一个monitor与之关联,并记录了指向monitor的地址,不再记录之前的信息。
monitor中的owner则记录了谁是这把锁的主人,此时记录了Thread-2
此时线程2成功获取到了monitor。
阻塞队列
此时来了一个新的线程Thread-1,他会先检查obj是否关联到了一个monitor锁,此时发现已经关联,然后检查这个monitor是否有一个主人Owner,发现他有Owner为Thread-2,所以Thread-1无法获取锁,此时Thread-1会通过EntryList(等待队列或阻塞队列)与monitor发生关联,然后进行BLOCKED(阻塞)状态。
如果此时Thread-3来了,再同上面过程检查一遍后进入EntryList与Thread-1一同等待
唤醒等待队列
由Thread-1和Thread-3进行竞争决定谁成为新Owner
注意
- synchronized必须是进入同一个对象的monitor才有上述的效果
- 不加synchronized的对象不会关联监视器,不遵从上述规则