早期版本的synchronized会将获取不到锁的线程直接挂起,性能不好
JDK 6 时对synchronized的实现进行优化,也就是锁升级
锁的状态可以分为无锁、偏向锁、轻量级锁、重量级锁
可以暂时把重量级锁理解为早期获取不到锁就让线程挂起,新的优化也就是轻量级锁和偏向锁
mark word
为了更好的说明锁升级,我们先来聊聊Java对象头中的mark word
我们下面的探究都是围绕64位的虚拟机
Java对象的内存由mark word、klass word、如果是数组还要记录长度、实例数据(字段)、对其填充(填充到8字节倍数)组成
mark word会记录锁状态,在不同锁状态的情况下记录的数据也不同
下面这个表格是从无锁到重量级锁mark word记录的内容