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 @ 2024-08-15 16:49  辉辉、  阅读(137)  评论(0)    收藏  举报