锁的升级(synchronized关键字)
2023-05-01 19:08:12 0 举报
主要是synchronized关键字底层实现的流程图
作者其他创作
大纲/内容
是否偏向锁?
未活动状态或已退出同步代码块
否
升级为轻量级锁
开始轻量级锁解锁
原持有偏向锁的线程
拷贝对象头中Markword到原持有偏向锁线程的锁记录中
获得轻量级锁[指向当前线程锁记录的指针]
是
唤醒持有偏向锁的线程
自旋达到一定次数CAS操作依旧没有成功
自旋
从安全点继续执行
原持有偏向锁的线程到达安全点
偏向锁的撤销【等待竞争出现才释放锁的机制】
1(是)
0(否)
拷贝对象头中Markword到当前线程的锁记录中
失败
CAS操作替换Thread id
原持有偏向锁的线程获得轻量级锁
获得偏向锁[记录当前线程ID]
暂停原持有偏向锁的线程
释放锁
升级/转变为重量级锁
执行同步代码块
未退出同步代码块
重量级锁(标志位:10)
轻量级锁(标志位:00)
检查原持有偏向锁的线程状态
成功
目前锁状态?
线程访问同步代码块
唤醒原持有偏向锁的线程
当前线程的栈中分配锁记录
原持有偏向锁的线程的栈中分配锁记录
唤醒被挂起的那些线程
标志位:01
原持有偏向锁的线程释放锁
当前线程
开始新一轮的锁竞争
CAS操作将对象头的Markword所记录指针指向当前线程锁记录
1、对象头中Markword中所记录指针是否仍然指向当前线程锁记录2、赋值在当前线程锁记录的Markword信息是否与对象头中的Markword一致
Mutex挂起当前线程
检查对象头的Markword中记录的是否是当前线程的ID
CAS操作(1&2)
0 条评论
回复 删除
下一页