技术文摘
面试速攻:Synchronized 的底层实现机制
面试速攻:Synchronized 的底层实现机制
在 Java 多线程编程中,Synchronized 是一种常用的同步机制,用于保证线程安全。理解其底层实现机制对于面试和实际开发都具有重要意义。
Synchronized 关键字可以修饰方法或代码块。当修饰方法时,整个方法体成为同步区域;当修饰代码块时,指定的代码块成为同步区域。
从底层实现来看,Synchronized 是基于对象头中的标记来实现的。在 Java 中,对象在内存中存储的布局分为对象头、实例数据和对齐填充。对象头中包含了与同步相关的信息。
对于同步方法,JVM 会通过在方法的访问标志中设置相应的标志来表示该方法是同步的。而对于同步代码块,是通过 monitorenter 和 monitorexit 指令来实现的。
当线程进入同步区域时,首先会尝试获取对象的锁。如果锁未被占用,线程成功获取锁,将对象头中的标记进行修改,以表示该线程持有锁。如果锁已被其他线程占用,当前线程则会进入阻塞状态,等待锁被释放。
在锁释放时,持有锁的线程会修改对象头中的标记,并唤醒等待中的线程,让它们重新竞争获取锁。
Synchronized 采用的是悲观锁策略,即默认情况下认为多线程竞争是激烈的,可能会出现冲突,因此在操作前就先获取锁。
另外,Synchronized 还涉及到锁的升级机制。在竞争不激烈时,使用偏向锁;当存在一定竞争时,升级为轻量级锁;当竞争激烈时,升级为重量级锁。
偏向锁是指当一个线程获取锁时,如果没有其他线程竞争,会将锁偏向该线程,下次该线程再次获取锁时无需再进行同步操作。轻量级锁则是通过 CAS 操作来尝试获取锁,避免了阻塞和唤醒线程的开销。重量级锁则是通过操作系统的互斥量来实现,开销较大。
深入理解 Synchronized 的底层实现机制,有助于我们在多线程编程中更合理地运用它,提高程序的性能和并发处理能力,同时在面试中也能更好地应对相关问题,展现自己扎实的技术功底。
TAGS: 底层实现 面试技巧 面试速攻 Synchronized 底层
- Java 开源的 Spring Boot 即时通讯 IM 聊天系统
- 工作 10 年后重看:String s = new String("xyz") 创建了几个对象?
- 基于 RT-Thread 的 FinSH 实现硬件编程
- 被低估的 JavaScript 框架:三位隐藏能力者
- 掌握这些概念 提升代码编写质量与简洁度
- 英伟达开源「Imaginaire」:九种图像与视频合成方式
- 开发人员忙乱易犯的 3 个疏忽
- Sourcegraph:如今开发人员管理的代码量是 2010 年的 100 倍
- Git 中提升开发效率的命令:cherry-pick
- 谈谈 Python 中的 PrettyPrint 和 PPrint
- ScanT3r:强大的 Web 安全扫描利器
- 9 月 Github 热门 Java 开源项目
- 码农 996 无法改变世界,维多利亚时代已证明
- PyTorch 版 YOLOv4 迎来更新 支持自定义数据集
- 面试官:探讨三个线程顺序执行的多种实现方式