轻量级锁的加锁过程
2020-07-04 17:22:37 16 举报
Java轻量级锁的加锁过程
作者其他创作
大纲/内容
第一步:在代码块进入同步块时,如果同步对象锁状态为无锁状态(锁标志位01,是否偏向锁0),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝,官方称之为Displaced Mark Word。
Padding
第二步:拷贝对象头中的Mark Word复制到锁记录中
01
owner
Displaced Mark Word
对象头
Mark Word
10
LockRecord
栈帧
拷贝
实例数据
是否偏向锁
0
... ...
00
锁标志位
第三步:拷贝成功后,虚拟机将使用CAS操作尝试将对象的Mark Word更新为指向Lock Record的指针,并将Lock Record里的owner指针指向对象的Mark Word
成功与否
指向栈中锁记录的指针
如果更新操作失败了,虚拟机首先会检查对象的Mark Word是否指向当前线程的栈帧,如果是,说明当前线程已经拥有了这个对象的锁,那么可用直接进入同步块继续执行。否则说明有多个线程竞争锁,若当前只有一个等待线程,则线程会通过自旋进行等待;但当自旋超过一定次数或者一个线程持有锁,一个在自旋,又来了第三个线程竞争锁,那么轻量级锁会膨胀升级为重量级锁,锁标志位设置为10。
更新成功
如果更新动作成功了,那么这个线程就拥有了该对象的锁,此时对象Mark Word锁标志位设置为00,表示此对象处于轻量级锁定状态
更新失败
0 条评论
下一页