jvm_book icon indicating copy to clipboard operation
jvm_book copied to clipboard

P483

Open GawinHong opened this issue 4 years ago • 1 comments

周老师,你好 P483原文:

那么当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的标志位设置为“01”、把偏向模式设置为“1”,表示进入偏向模式。【同时】使用CAS操作把获取到这个锁的线程的ID记录在对象的Mark Word之中。

老师可以试试跑下这个代码,要引入jol依赖观察对象头的布局

<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.8</version> </dependency>

public static void main(String[] args) throws InterruptedException { Thread.sleep(5000); A a = new A(); System.out.println(ClassLayout.parseInstance(a).toPrintable()); } hotspot在启动后,有几秒的初始化时间,这个时间是不会有偏向锁的, 在-XX:BiasedLockingStartupDelay的时间过后再执行 A a = new A(); 这个时候创建时已经把“对象头中的标志位设置为“01”、把偏向模式设置为“1””, 但是并没有【同时】“使用CAS操作把获取到这个锁的线程的ID记录在对象的Mark Word之中”

我是在这个文章看到的,也自己试验和观察了一遍 https://www.cnblogs.com/LemonFive/p/11246086.html

不知道P483书中原文说的“那么当锁对象第一次被线程获取的时候”指的是访问同步块还是创建新对象时,但是根据观察的结果,不会存在这两个动作是【同时】发生的,一个是对象创建就已经设置好了,一个是访问同步块发生的

GawinHong avatar Nov 12 '20 15:11 GawinHong

严谨起见,这段话修正为“【并】使用CAS操作把获取到这个锁的线程的ID记录在对象的Mark Word之中”。

fenixsoft avatar Nov 14 '20 03:11 fenixsoft