首先先了解下对象头结构(对象体这里忽略)
Mark Word的存储内容会随着不同的状态而变化
创建锁记录对象:
加锁方法的栈帧中会有一个锁记录结构,内部可以存储锁定对象的Mark Word,让锁记录中Object reference指向锁对象,并尝试用cas替换Object的Mark Word,将Mark Word的值存入锁记录
如果cas成功,对象头中存储了锁记录地址和状态00,表示由该线程给对象加锁,结果如图所示
如果cas失败
如果是其它线程已经有了该Object的轻量锁,这是表明有竞争,进入锁膨胀
如果是自己执行了synchronized锁重入,那么再添加一条Lock Record作为重入计数
当退出同步代码块如果有取值为null的锁记录时,表示有重入,计数减一
当退出同步代码块如果没有取值为null的锁记录时,用cas将Mark Word值恢复给对象头,如果失败说明轻量锁已经锁膨胀升级为重量锁,那么会继续执行重量锁的解锁步骤