Synchronized锁膨胀过程
2021-08-02 15:47:29 8 举报
Synchronized锁膨胀过程
作者其他创作
大纲/内容
升级为重量级锁
01标志位
将对象头MarkWord中锁的指针指向当前线程锁记录
升级为轻量锁
唤醒原持有偏向锁的线程
失败
重量级锁10标志位
唤醒被挂起的线程
成功
检测对象头MarkWord中是否记录当前线程ID
1 是
是否偏向锁
CAS操作替换线程ID
CAS自旋
自旋到一定次数仍未成功
CAS操作1. 对象头MarkWord中的锁记录指针是否仍执行持有锁的线程的锁记录2. 拷贝在线程中的MarkWord信息是否与对象头MarkWord信息一致
失效
获取轻量级锁指向当前线程锁记录的指针为00
目前锁状态?
获取偏向锁
拷贝对象头MarkWord到当前线程的锁记录中
开启轻量级锁解锁
拷贝对象头的MarkWord到持有锁的线程的锁记录中
原持有偏向锁的线程到达安全点
原持有偏向锁的线程升级为轻量级锁,指向原持有偏向锁记录的线程指针,锁标志为00
从安全点继续执行
执行同步资源代码块
原持有偏向锁的线程的栈中分配锁记录
0 否
撤销已获取偏向锁(因为已经存在竞争环境)
线程访问同步资源代码块
检查持有偏向锁的状态
轻量级锁00标志位
是
暂停原持有偏向锁的线程
释放锁
当前线程的栈中分配锁记录
当前线程
再尝试
挂起当前线程
阻塞态/已退出同步代码块
开启新一轮的锁竞争
未退出同步代码块
收藏
0 条评论
下一页