jol查看对象头来分析一波synchronize关键字加锁过程
synchronize在jdk1.5之前就是一个重量级的锁,是在jvm层面加锁的一种形式,在字节码运行的过程中被翻译成了两个指令,速度很慢。jkd1.6开始对synchronize进行了非常多的优化,使sync有了一个锁升级机制,可以让sync在不同的场景下加不同的锁,大大提升了sync的效率。sync一共有三种锁状态:偏向锁、轻量级锁、重量级锁。下面通过查看class对象头的方式来查看这几个锁状态是怎么表现的。
import org.openjdk.jol.info.ClassLayout;
import org.openjdk.jol.vm.VM;
import static java.lang.System.out;
public class JOLExample1 {
public static void main(String[] args) throws Exception {
A a = new A();
out.println(VM.current().details());
out.println(ClassLayout.parseInstance(a).toPrintable());
}
}
# Running 64-bit HotSpot VM.
# Using compressed oop with 3-bit shift.
# Using compressed klass with 3-bit shift.
# Objects are 8 bytes aligned.
# Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
# Array element sizes: 4, 1,