JDK15开始偏向锁不再默认开启
JDK8中偏向锁

回忆一下对象头格式
|--------------------------------------------------------------------|--------------------|| Mark Word ( 64 bits ) | State ||--------------------------------------------------------------------|--------------------|| unused: 25 | hashcode: 31 | unused: 1 | age: 4 | biased_lock: 0 | 01 | Normal | 普通模式 001|--------------------------------------------------------------------|--------------------|| thread: 54 | epoch: 2 | unused: 1 | age: 4 | biased_lock: 1 | 01 | Biased | 偏向锁 101|--------------------------------------------------------------------|--------------------|| ptr_to_lock_record: 62 | 00 | Lightweight Locked ||--------------------------------------------------------------------|--------------------|| ptr_to_heavyweight_monitor: 62 | 10 | Heavyweight Locked ||--------------------------------------------------------------------|--------------------|| | 11 | Marked for GC ||--------------------------------------------------------------------|--------------------|
一个对象创建时:
- 如果开启了偏向锁(默认开启),那么对象创建后,markword 值为 0x05 即最后 3 位为 101,这时它的 thread、epoch、age 都为 0;
- 偏向锁是默认是延迟的,不会在程序启动时立即生效,如果想避免延迟,可以加 VM 参数-XX:BiasedLockingStartupDelay=0 来禁用延迟
- 如果没有开启偏向锁,那么对象创建后,markword 值为 0x01 即最后 3 位为 001,这时它的 hashcode、 age 都为 0,第一次用到 hashcode 时才会赋值。
JDK17中添加禁用延迟参数,或者通过sleep查看偏向锁结果,均为disable状态
package com.kh.JUC;
import lombok.extern.slf4j.Slf4j;
import org.openjdk.jol.info.ClassLayout;
@Slf4j
public class BiasedLock {
public static void main(String[] args) throws InterruptedException {
Dog dog = new Dog();
log.info("dog info: {}", ClassLayout.parseInstance(dog).toPrintable());
Thread.sleep(5000);
log.info("dog info: {}", ClassLayout.parseInstance(new Dog()).toPrintable());
}
}
class Dog {
}
OpenJDK 官网如下:为降低维护成本,自JDK15之后,偏向锁默认是Disable的
深入理解整个流程:
在Java 17中偏向锁可算废了_jdk17偏向锁-CSDN博客