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