synchronized同步锁升级流程图
2020-07-08 13:01:25 53 举报
synchronized同步锁升级流程图
作者其他创作
大纲/内容
markword(储存对象的hashcode或锁信息)
2bit(锁标志位)
否
1bit(是否偏向锁)是否禁用偏向
重量级锁
hashcode(25bit)
Epoch
获取轻量级锁,执行同步代码块
失败
唤醒持有偏向锁的线程
锁状态
成功
4bit
32bit
00
升级为轻量级锁(指向栈的指针|00)
array data(数组实际数据)
对象分代年龄
偏向锁
11
暂停持有偏向锁的线程
线程id
instance data(对象实际数据)
1
撤销偏向锁
线程阻塞
匿名偏向(Anonymously biased): 在此状态下thread_ptr为NULL(0),意味着还没有线程偏向于这个锁对象。第一个试图获取该锁的线程将会面临这个情况,使用原子CAS指令可将该锁对象绑定于当前线程。这是允许偏向锁的类对象的初始状态。可重偏向(Rebiasable): 在此状态下,偏向锁的epoch字段是无效的(与锁对象对应的klass的mark_prototype的epoch值不匹配)。下一个试图获取锁对象的线程将会面临这个情况,使用原子CAS指令可将该锁对象绑定于当前线程。在批量重偏向的操作中,未被持有的锁对象都被至于这个状态,以便允许被快速重偏向。已偏向(Biased): 这种状态下,thread ptr非空,且epoch为有效值——意味着其他线程正在只有这个锁对象。
对象分代年龄(4bit)
自旋获取锁
检查对象头是否储存当前线程
0
Array
01
轻量级锁
classmatedataaddress元数据(储存对象数据类型的指针)
线程
同步代码块
空
25bit
GC标志
23bit
CAS替换mark word
膨胀升级为重量级锁(指向重量级锁的指针|10)
将对象头mark word中的线程id指向自己T1|Epoch|1|01
指向互斥量(重量级锁)所在的指针(monitor指针)
执行同步代码块
达到一定的次数
分配空间并复制mark word到栈
Object(lock)
2bit
锁标志位(2)
32位markword储存信息
是
data
全局安全点:当前时间点没有正在执行的字节码
是否偏向锁(1)
解锁:将对象头mark word设置为无锁状态或标志对象不适合偏向锁(撤销偏向锁)T1|null|0|01
padding(可能填充)
无锁
原持有偏向锁的线程到达全局安全点
synchronized(lock)
访问
array length(数组长度)
Object
classmatedataaddress元数据(储存数组数据类型的指针)
markword(储存数组的hashcode或锁信息)
Header
10
对象hashcode
指向栈中锁记录的指针
检查持有偏向锁的线程是否活跃(不活跃或退出、未执行同步代码块)
收藏
0 条评论
下一页