Java中synchronized的底层原理和锁升级过程是怎样的

发布时间:2026/5/20 11:51:39

Java中synchronized的底层原理和锁升级过程是怎样的 深入Java synchronized升级底层机制和锁synchronized是Java中用于线程同步的重要关键字其底层实现和锁定升级机制对并发性能非常重要。本文将结合示例代码对锁定的升级过程进行深入探讨。以下示例代码演示了不同锁状态的转换public static void main(String[] args) throws InterruptedException { // Hotspot虚拟机启动后有4秒的延迟 Thread.sleep(5000); Object obj new Object(); System.out.println(初始状态 \n ClassLayout.parseInstance(obj).toPrintable()); new Thread(() - { synchronized (obj) { System.out.println(Thread.currentThread().getName() 获取锁执行。。。。\n ClassLayout.parseInstance(obj).toPrintable()); } }, 线程A).start(); Thread.sleep(1000); new Thread(() - { synchronized (obj) { System.out.println(Thread.currentThread().getName() 获取锁执行。。。\n ClassLayout.parseInstance(obj).toPrintable()); } }, 线程B).start(); // 睡眠5秒后 Thread.sleep(5000); System.out.println(Thread.currentThread().getName() ClassLayout.parseInstance(obj).toPrintable()); }运行此代码观察输出结果可以看到锁状态从无锁到偏向锁、轻量级锁甚至重量级锁的转换过程(注:高版JVM已经放弃偏向锁)。synchronized的锁升级过程如下立即学习“Java免费学习笔记(深入)无锁状态: 对象的初始状态包括哈希码、GC年龄等信息。偏向锁 (已在较新JVM版本中弃用): 当只有一个线程访问同步块时JVM将锁偏向线程对象头记录偏向线程ID以减少锁获取成本。轻量级锁: 当第二个线程试图获得锁时如果偏向锁的线程不在同步块中执行则偏向锁将升级为轻量级锁。轻量级锁试图通过旋转获得锁。旋转次数有限如果失败将升级为重量级锁。重量级锁: 线程悬挂操作系统调度费用大适用于高竞争场景。示例代码的输出结果将显示锁状态的转换如从无锁到轻量级锁再到可能的重量级锁。 (因为偏向锁被丢弃可能不会显示偏向锁状态)。 对这些输出结果的分析可以更深入地理解锁升级的动态过程。总之掌握Java并发编程和性能优化了解synchronized的底层机制和锁升级过程至关重要。 这些知识可以通过代码实践和结果分析更有效地学习和应用。

相关新闻