我们从网上看到很多,升级到重量锁的时候不会降级,再来线程都是重量级锁
今天我们来实验一把真的是这样的吗
1.首选导入Java对象内存布局的工具库:
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.14</version>
</dependency>
2.代码:
public class Test {
static Object LOCK;
public static void main(String[] args) throws InterruptedException {
LOCK = new Object();
System.out.println("无锁的时候对象布局:" + ClassLayout.parseInstance(LOCK).toPrintable());
IntStream.rangeClosed(1, 4).forEach(i -> {
getLOCK();
});
Thread.sleep(3000L);
System.out.println("无竞争之后,此时对象布局:" + ClassLayout.parseInstance(LOCK).toPrintable());
getLOCK();
}
public static void getLOCK() {
new Thread(() -> {
try {
synchronized (LOCK) {
System.out.println("线程[" + Thread.currentThread().getName() + "]" +
"重量级锁状态对象布局:" + ClassLayout.parseInstance(LOCK).toPrintable());
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
3.结果
4.结论:
从实验我们可以得知,升为重量级锁后,并不会一直是重量级锁,
一开始没有竞争的时候是无锁,然后四个线程来竞争的时候是重量级锁,释放锁之后又是无锁,再来一个线程变为轻量级锁