JDK15开始偏向锁不再默认开启
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 {
}
如下:为降低维护成本,自JDK15之后,偏向锁默认是Disable的
深入理解整个流程: