synchronized升级过程

1.对象有三个区域

对象头/实例数据/对其填充

对象头又包含Mark Word/类型指针->指向方法区/数组长度

Mark Word如下图所示

2.偏向锁

当线程首次进入synchronized,他会将对象头的mark work更新为偏向锁。

JDK已废除

3.轻量锁

当线程获取已被偏向的锁时,会将锁升级为轻量锁。

具体过程是这样

先将对象头的mark work复制到线程栈中

通过CAS操作,将对象头的mark work更新指向线程栈中的记录,如果CAS成功(默认自旋15次)则升级为轻量级锁。

失败则表示已经其他线程操作过了,需要升级为重量级锁

 

为什么要把对象的mark work复制到线程栈中,是因为锁的获取和释放都是成对出现的。

当锁释放的时候,就需要将原有的线程栈mark word恢复到对象头中。

 

4.重量级锁

轻量级锁CAS操作失败,就会升级到重量级锁

 

 

posted @   辉辉、  阅读(80)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示