Synchronized升级到重量级锁会发生什么?

我们从网上看到很多,升级到重量锁的时候不会降级,再来线程都是重量级锁
今天我们来实验一把真的是这样的吗

1.首选导入Java对象内存布局的工具库:

java 复制代码
 <dependency>
            <groupId>org.openjdk.jol</groupId>
            <artifactId>jol-core</artifactId>
            <version>0.14</version>
        </dependency>

2.代码:

java 复制代码
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.结论 :

从实验我们可以得知,升为重量级锁后,并不会一直是重量级锁,

一开始没有竞争的时候是无锁,然后四个线程来竞争的时候是重量级锁,释放锁之后又是无锁,再来一个线程变为轻量级锁

相关推荐
三8442 小时前
Fastjson 漏洞学习笔记 · 03 · 经典利用链:TemplatesImpl 与 JdbcRowSetImpl
java·web安全·fastjson
蜗牛互联网2 小时前
GPT-6.1 Sol迁移指南:从token单价转向每任务成本门禁
java·人工智能·后端·gpt
蜗牛互联网2 小时前
HSTU在Dynamo-Triton中的AOTI与KV缓存验收方法
java·人工智能·后端·缓存
Sirens.2 小时前
Java多线程实例:单例模式、阻塞队列、线程池与定时器
java·开发语言·单例模式
青山木2 小时前
秒杀系统设计(一):需求拆解与流量治理
java·数据库·redis·后端·架构
卓怡学长2 小时前
w195基于ssm“Fitfrend”个性化健身
java·intellij-idea
驭渊的小故事3 小时前
算法实战:滑动窗口、素数枚举与字符串模拟(三道经典题解)
java·算法
雪落漂泊3 小时前
Linux基本指令(下)
java·linux·服务器
Eloudy3 小时前
全文 - version.A - AMBA CHI Chip-to-Chip(C2C)
java·开发语言·数据库·gpu·chiplet
谁是谁的谁_bj3 小时前
Process Lasso进程调度/资源管理工具
java