synchronized锁实现与升级过程
2024-03-05 17:52:28 0 举报
java synchronized锁升级流程图
作者其他创作
大纲/内容
线程访问同步块代码
唤醒被挂起的线程
epoch
获得偏向锁(101)
检查原持有偏向锁的线程状态
拷贝对象头中的mark word到当前线程的锁记录中
开始新一轮竞争
重量级锁
开始偏向锁撤销(等待竞争结束才释放锁)
age
从安全的继续执行
原持有偏向锁的线程释放
thread id
特征
01标志位
释放锁
原持有偏向锁的线程到达安全点
自旋
CAS操作(1&&2)1.对象头中mark word中锁记录指针是否仍然指向当前线程锁记录2.拷贝在当前线程锁记录的mark word是否与对象头中的mark word一致
检查对象头中markword记录的线程是否为当前线程id
无锁
获得轻量级锁(00)指向当前线程锁记录的指针
目前锁状态
只需比较thread id
指向重量级monitor的指针
00
成功
暂停原持有偏向锁的线程
mutex挂起当前线程
拷贝对象头中的mark word到原持有偏向锁线程的锁记录中
失败
升级为重量级锁
未退出同步代码块
已退出同步代码块
-
bit
是
可GC
依赖mutex
11
1是
不是
0否
是否偏向锁
执行同步代码块
用于gc标记
01
hash
轻量级锁
再尝试
当前线程的栈中分配锁记录
mark word
轻量级锁(00)
自旋到一定次数
CAS操作将对象头mark word中锁记录的指针指向当前线程锁记录
10
开始轻量级锁解锁
转变为重量级锁(10)指向重量级锁monitor的指针
原持有偏向锁线程的锁的栈中分配的锁记录
唤醒持有偏向锁的线程
原持有偏向锁线程获得轻量级锁(00)指向原持有偏向锁线程锁记录的指针
标志位(2位)
偏向锁
CAS操作替换Thread ID
唤醒原持有偏向锁的线程
重量级锁(10)
指向当前锁记录的指针ptr to lock record
原持有偏向锁的线程
升级为轻量级锁
状态
0 条评论
回复 删除
下一页