【面试:并发篇14:多线程: Monitor 概念】
00.前言
如果有任何问题请指出,感谢。
01.Java 对象头
以32位虚拟机为例
普通对象
Object Header(64bit) |
---|
Mark Word(32bits) | Klass Word(32bits) |
---|
解释
对象头里面包含:Mark Word(32bits)Klass Word(32bits)
Klass Word(32bits):它是一个指针 它指向了它所属的类
Mark Word(32bits):下面详细解释
数组对象
Object Header(64bit) |
---|
Mark Word(32bits) | Klass Word(32bits) | array length(32bits) |
---|
数组对象多了一个array length(32bits) 用来指定数组长度
Mark Word结构
Mark Wor(32bits) | 加锁状态 | 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_montior:30 | 10 | Heavyweight Locked |
11 | Marked for GC |
02.Monitor
介绍
Monitor被翻译为监视器或管程,每一个java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级锁)之后,改对象头的MarkWord中被设置指向Monitor对象的指针
图片解释
![](https://myblogtuchang.oss-cn-beijing.aliyuncs.com/resources-master/202207111412665.png)
我们可以看到此时为 两个线程还没有执行 临界区代码块,所以此时的obj对象的MarkWord为上述MarkWord状态中的normal状态。
![](https://myblogtuchang.oss-cn-beijing.aliyuncs.com/resources-master/202207111412608.png)
之后Thread-1先执行了临界区代码,所以此时obj对象的MarkWord中加锁状态变成了10 状态变成了Heavyweight Locked,现在obj对象头的MarkWord被设置为指向Monitor的指针,并且此时Monitor正在监视Thread-1。
![](https://myblogtuchang.oss-cn-beijing.aliyuncs.com/resources-master/202207111412347.png)
然后Thread-2去获取锁 发现已经被占用,然后就被放置到了阻塞列表EntryList。