锁升级全过程
2022-07-06 23:20:49 28 举报
synchronized锁升级详细过程
作者其他创作
大纲/内容
转变为重量级锁指向重量级锁monitor的指针 | 锁标志位 (10)
成功
获得轻量级锁指向当前线程锁记录的指针 | 锁标志位(00)
失败
CAS 操作将对象头的 Mark Word 中锁记录指针指向当前线程锁记录
重量级锁
开始轻量级锁解锁
获得偏向锁Thread ID | epcho | age | 是否偏向锁(1) | 锁标志位(01)
升级为重量级锁
暂停原持有偏向锁的线程
检查锁状态位
是否偏向锁
原持有偏向锁的线程获得轻量级锁指向原持有偏向锁线程锁记录的指针 | 锁标志位(00)
否
原持有偏向锁的线程的栈中分配锁记录Lock Record
挂起当前线程
未退出同步代码块
自旋一定次数CAS操作依然没有成功
原持有偏向锁的线程到达安全点
从安全点处继续执行
轻量级锁
是
检查对象头的Mark Word 中线程ID是否为空
唤醒原持有偏向锁的线程
释放锁
检查原持有偏向锁的线程状态
CAS 操作替换 Thread ID
开始撤销偏向锁
原持有偏向锁的线程释放锁空 | 是否偏向锁(0) | 锁标志位(01)
唤醒哪些被挂起的线程
检查对象头的Mark Word 中线程ID是否为当前线程
访问同步代码块
执行同步代码块
拷贝对象头的Mark Word 到当前线程的锁记录中
自旋
原持有偏向锁的线程
01 (标志位)
01标志位
拷贝对象头的Mark Word 到原持有偏向锁线程的锁记录中
开始CAS操作(1&2)1.对象头的Mark Word中锁记录指针是否依然指向当前线程锁记录 2.拷贝在当前线程Lock Record中的的Mark Word信息是否与对象头的Mark Word一致
当前线程
开启新一轮锁竞争
已退出同步代码块
升级为轻量级锁
00 (标志位)
再尝试
当前线程的栈中分配锁记录
0 条评论
下一页