【多线程:Monitor 概念】
01.Java 对象头
以32位虚拟机为例
普通对象
解释
对象头里面包含:Mark Word(32bits)Klass Word(32bits)Klass Word(32bits):它是一个指针 它指向了它所属的类
Mark Word(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对象的指针
图片解释
我们可以看到此时为 两个线程还没有执行 临界区代码块,所以此时的obj对象的MarkWord为上述MarkWord状态中的normal状态。
之后Thread-1先执行了临界区代码,所以此时obj对象的MarkWord中加锁状态变成了10 状态变成了Heavyweight Locked,现在obj对象头的MarkWord被设置为指向Monitor的指针,并且此时Monitor正在监视Thread-1。
然后Thread-2去获取锁 发现已经被占用,然后就被放置到了阻塞列表EntryList。