技术文摘
面试速攻:Synchronized 的底层实现机制
面试速攻:Synchronized 的底层实现机制
在 Java 多线程编程中,Synchronized 是一种常用的同步机制,用于保证线程安全。理解其底层实现机制对于面试和实际开发都具有重要意义。
Synchronized 关键字可以修饰方法或代码块。当修饰方法时,整个方法体成为同步区域;当修饰代码块时,指定的代码块成为同步区域。
从底层实现来看,Synchronized 是基于对象头中的标记来实现的。在 Java 中,对象在内存中存储的布局分为对象头、实例数据和对齐填充。对象头中包含了与同步相关的信息。
对于同步方法,JVM 会通过在方法的访问标志中设置相应的标志来表示该方法是同步的。而对于同步代码块,是通过 monitorenter 和 monitorexit 指令来实现的。
当线程进入同步区域时,首先会尝试获取对象的锁。如果锁未被占用,线程成功获取锁,将对象头中的标记进行修改,以表示该线程持有锁。如果锁已被其他线程占用,当前线程则会进入阻塞状态,等待锁被释放。
在锁释放时,持有锁的线程会修改对象头中的标记,并唤醒等待中的线程,让它们重新竞争获取锁。
Synchronized 采用的是悲观锁策略,即默认情况下认为多线程竞争是激烈的,可能会出现冲突,因此在操作前就先获取锁。
另外,Synchronized 还涉及到锁的升级机制。在竞争不激烈时,使用偏向锁;当存在一定竞争时,升级为轻量级锁;当竞争激烈时,升级为重量级锁。
偏向锁是指当一个线程获取锁时,如果没有其他线程竞争,会将锁偏向该线程,下次该线程再次获取锁时无需再进行同步操作。轻量级锁则是通过 CAS 操作来尝试获取锁,避免了阻塞和唤醒线程的开销。重量级锁则是通过操作系统的互斥量来实现,开销较大。
深入理解 Synchronized 的底层实现机制,有助于我们在多线程编程中更合理地运用它,提高程序的性能和并发处理能力,同时在面试中也能更好地应对相关问题,展现自己扎实的技术功底。
TAGS: 底层实现 面试技巧 面试速攻 Synchronized 底层
- 15 岁中国学生凭 2 个周末写代码获苹果 WWDC 奖学金
- 2019 高考编程卷:谷歌面试编程题与 MIT 版解题技巧
- 填平十个编码过程中的“坑”,一篇文章就够!
- Python 中十大免费优质图像处理工具
- 一眼看懂“分布式锁”原理
- 你正在使用哪款 JavaScript 编辑器?
- 逐图解析分布式架构的发展历程
- Java 与 Python 算法及数据结构面试要点
- 从零构建 node 命令行工具
- 写好 C 语言 main 函数的方法
- 微服务架构实践:仅懂 Docker 与 Spring Boot 足够吗?
- 阿里推出的 12 种常用后端开发工具
- 无需数学,搞定这几个机器学习核心问题
- 2019 年网络爬虫及相关工具
- 马蜂窝 ABTest 多层分流系统的构建与落地