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、epochage 都为 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偏向锁-优快云博客 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值