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操作失败,就会升级到重量级锁
每天坚持,终会抵达!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了