Synchronized锁升级流程
2021-05-09 17:05:48 16 举报
Synchronized锁升级流程是指当一个线程访问同步代码块时,会首先获取对象的锁,如果该对象没有被其他线程占用,则当前线程获得锁并执行同步代码块;如果该对象已经被其他线程占用,则当前线程进入等待状态。在等待状态下,当有其他线程释放了该对象的锁时,当前线程会被唤醒并尝试获取锁。如果此时仍然没有其他线程竞争该锁,则当前线程获得锁并执行同步代码块;如果有其他线程竞争该锁,则当前线程继续进入等待状态。这种机制被称为自旋锁或忙等待。
作者其他创作
大纲/内容
CAS更新为A的线程ID
Lock Record
CAS更新成功
CAS是否成功
检查是否可以偏向
结束
Owner:nullDMW:无锁状态hashCode|GCage|0|01
线程A
是
否
Displaced Mark Word简称为DMW
Mark Word
自旋失败
monitorenter
MW:轻量级锁状态指向线程A的Lock Record指针|00
MW:无锁状态hashCode|GCage|0|01
轻量级锁升级为重量级锁,Mark Word的内容指向对象Monitor,调用OS互斥原语,挂起当前线程
判断Mark Word中是否存储了A的线程ID
判断锁对象是否仍被A锁定
拷贝Mark Word到Lock Record中,用于CAS比较
成功
MW:重量级锁状态对象Monitor起始地址|10
CAS尝试将Mark Word中的内容指向线程A的Lock Record,Lock Record中的Owner指针指向Mark Word,升级为轻量级锁
Owner:指向Mark WordDMW:轻量级锁状态指向线程A的Lock Record指针|00
CAS尝试将Mark Word的内容依然指向线程A的Lock Record,且拷贝Mark Word 与对象Mark Word一直,则替换
否,继续自旋
CAS更新失败
释放锁,并唤醒被当前重量级锁Monitor挂起的线程
Owner:A的线程IDDMW:偏向锁状态线程A的 ID|Epoch|GCage|1|01
是否自旋结束
失败
线程B
执行同步代码
monitorexit
到达安全点挂起线程A
撤销偏向锁
在当前线程栈帧中创建Lock Record
等待解锁时被唤醒,重复monitorenter
继续持有锁,恢复线程执行同步代码
Mark Word简称为MW
对象恢复为无锁状态
MW:偏向锁状态线程A的 ID|Epoch|GCage|1|01
收藏
收藏
0 条评论
下一页