目录

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

目录

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

JDK8中偏向锁

https://i-blog.csdnimg.cn/direct/bd2107c8eab2491299596414ba76f78c.png

回忆一下对象头格式

|——————————————————————–|——————–|

|

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 {

}

https://i-blog.csdnimg.cn/direct/0c571c78200a4e46bc73cd771e7fff8a.png

如下:为降低维护成本,自JDK15之后,偏向锁默认是Disable的

https://i-blog.csdnimg.cn/direct/7c1a423ca2a44f8cb2f61c014d25fff2.png

深入理解整个流程: