偏向锁在什么条件下会升级为轻量级锁?

问题描述

synchronized锁升级时,偏向锁在什么条件下会升级为轻量级锁?

背景信息

Java版本为java11。

代码

(java)
复制代码
import org.openjdk.jol.info.ClassLayout; public class BiasedLockThreadIdCheck { static final Object lock = new Object(); public static void main(String[] args) throws Exception { System.out.println("Before any lock:"); System.out.println(ClassLayout.parseInstance(lock).toPrintable()); Thread t1 = new Thread(() -> { System.out.println("T1 ID: " + Thread.currentThread().getId()); synchronized (lock) { System.out.println("T1 获得锁后:"); System.out.println(ClassLayout.parseInstance(lock).toPrintable()); } }); t1.start(); t1.join(); // 注释下列代码前后,t2获得的锁类型不同! // Thread.sleep(5000); Thread t2 = new Thread(() -> { System.out.println("T2 ID: " + Thread.currentThread().getId()); synchronized (lock) { System.out.println("T2 获得锁后:"); System.out.println(ClassLayout.parseInstance(lock).toPrintable()); } }); t2.start(); t2.join(); } }

结果

中间没有sleep,t2获取到的是偏向锁,但是偏向的仍然是线程t1:

text
复制代码
Before any lock: # WARNING: Unable to get Instrumentation. Dynamic Attach failed. You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf java.lang.Object object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x0000000000000005 (biasable; age: 0) 8 4 (object header: class) 0x00001000 12 4 (object alignment gap) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total T1 ID: 27 T1 获得锁后: java.lang.Object object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x000001fea4a2e005 (biased: 0x000000007fa928b8; epoch: 0; age: 0) 8 4 (object header: class) 0x00001000 12 4 (object alignment gap) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total T2 ID: 28 T2 获得锁后: java.lang.Object object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x000001fea4a2e005 (biased: 0x000000007fa928b8; epoch: 0; age: 0) 8 4 (object header: class) 0x00001000 12 4 (object alignment gap) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

中间加了sleep之后(sleep时间相对要长一些),t2获取到的是轻量级锁:

text
复制代码
Before any lock: # WARNING: Unable to get Instrumentation. Dynamic Attach failed. You may add this JAR as -javaagent manually, or supply -Djdk.attach.allowAttachSelf java.lang.Object object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x0000000000000005 (biasable; age: 0) 8 4 (object header: class) 0x00001000 12 4 (object alignment gap) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total T1 ID: 27 T1 获得锁后: java.lang.Object object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x000001487e9b1005 (biased: 0x00000000521fa6c4; epoch: 0; age: 0) 8 4 (object header: class) 0x00001000 12 4 (object alignment gap) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total T2 ID: 28 T2 获得锁后: java.lang.Object object internals: OFF SZ TYPE DESCRIPTION VALUE 0 8 (object header: mark) 0x00000011a29ff080 (thin lock: 0x00000011a29ff080) 8 4 (object header: class) 0x00001000 12 4 (object alignment gap) Instance size: 16 bytes Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

困惑

很奇怪啊,就在写这个贴子的时候,中间没有sleep,有两次t2获取到的也是轻量级锁。所以偏向锁升级为轻量级锁的过程究竟是怎样的。

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP