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