Synchronized锁获取流程
2021-03-21 21:38:33 1 举报
Synchronized锁获取流程
作者其他创作
大纲/内容
轻量级锁00(标志位)
升级为轻量级锁
执行同步代码块
唤醒原持有偏向锁的线程
原持有偏向锁线程获得轻量级锁指向原持有偏向锁线程锁记录的指针 | (标志位)00
获得偏向锁Thread id | epoch | age (是否偏向锁)1 | 标志位01
CAS操作将对象头的Mark Word中锁记录指针指向当前线程锁记录
从安全点继续执行
获得轻量级锁指向当前线程锁记录的指针
成功
原持有偏向锁的线程到达安全点
检查对象头的Mark Word中记录的是否是当前线程ID
当前线程的栈中分配锁记录
失败
再尝试n次
01(标志位)
未活动状态/已退出同步代码块
目前锁状态
未退出同步代码块
释放锁
升级为重量级锁指向重量级锁monitor的指针 | (标志位)10
CAS操作1&21. 对象头中的 Mark Word中锁记录指针是否仍然指向当前线程锁记录2.拷贝在当前线程锁记录的 Mark Word信息是否与对象头中的 Mark Word一致
当前线程
是
拷贝对象头中的Mark Word到当前线程的锁记录中
暂停原持有偏向锁的线程
1是
是否偏向锁?
拷贝对象头中的Mark Word的原持有偏向锁线程的锁记录中
挂起当前线程
开始偏向锁撤销(等待竞争出现才释放锁的机制)
开始轻量级锁解锁
重量级锁10(标志位)
0(否)
唤醒被挂起的那些线程
不是
线程访问同步代码块
检查原持有偏向锁的线程状态
原持有偏向锁线程释放锁空 | (是否偏向锁)0 | (标志位)01
自旋
原持有偏向锁的线程的栈中分配锁记录
原持有偏向锁线程
CAS操作替换Thread id
开启新一轮的锁竞争
0 条评论
下一页