《Java并发编程之锁升级》图解
2022-04-28 10:47:10 27 举报
本图解来源于java并发编程,针对jvm锁升级进行的图解
作者其他创作
大纲/内容
开始新一轮锁竞争
获得轻量级锁指向当前线程锁记录指针 | 00(锁标志位)
失败
原持有偏向锁线程释放锁空 |(是否偏向锁)0 |(锁标志位)01
升级为轻量级锁
原持有偏向锁线程获得轻量级锁指向原持有偏向锁线程的锁记录指针 | 00(锁标志位)
成功
线程访问同步代码块
自旋
在原持有偏向锁线程的栈中分配锁记录
开始轻量级锁解锁
释放锁
不是
唤醒原持有偏向锁线程
01标志位
执行同步代码块
是(1)
CAS操作替换Thread ID
00标志位 轻量级锁
检查对象头Mark Word 中ThreadId是否是当前线程id
未退出同步代码块
拷贝对象头中Mark word 到当前线程的锁记录中
自旋达到一定次数CAS仍没成功
获得偏向锁Thread ID | epoch | age |(是否偏向锁)1 |(锁标志位)01
当前线程栈中分配锁记录
CAS操作1&21、对象头中Mark word指针是否仍然指向当前线程锁记录2、拷贝在当前线程中的锁记录是否与对象头Mark Word中的锁记录一致
CAS操作将对象头中Mark word 的锁记录指针指向当前线程栈中的锁记录
再尝试
检查原持有偏向锁线程的状态
开始偏向锁撤销(等待竞争出现才释放锁)
拷贝当前对象头中的锁记录到原持有偏向锁线程的锁记录中
原持有偏向锁线程
否(0)
暂停原持有偏向锁的线程
是否偏向锁?
唤醒原持有偏向锁的线程
升级为重量级锁
从安全点开始执行
唤醒等待线程
原持有偏向锁线程到达安全点
未活动/已退出同步代码块
当前线程
mutex挂起当前线程
10标志位 重量级锁
变为重量级锁指向重量级锁monitor的指针 | 10(标志位)
判断目前锁状态
收藏
0 条评论
下一页