当前位置: 首页 > news >正文

面试官:你真的理解 synchronized 吗?很多人答错

在 Java 面试中,synchronized是高频考点,但很多开发者的理解都不够深入。

常见误区:

  • synchronized 只是让方法加锁
  • synchronized 会影响性能,所以尽量少用
  • synchronized 只能用于方法或代码块

实际上,synchronized 的底层机制、锁升级策略以及与 JVM 结合的实现,是面试官重点考察的内容。

本文将从问题背景、技术原理、代码示例、实际应用场景、总结全面讲解 synchronized,帮助你在面试中脱颖而出。


一、问题背景

在多线程开发中,共享资源是导致线程安全问题的核心。

经典问题包括:

  • 数据竞争(Race Condition)
  • 脏读(Dirty Read)
  • 丢失更新(Lost Update)

例如:

publicclassCounter{privateintcount=0;publicvoidincrement(){count++;}}

多线程调用increment()时:

  • count++实际是三条指令:读取、加 1、写回
  • 多线程同时执行会出现数据不一致

解决办法之一就是synchronized


我整理了一套完整Java面试题库,
完整版在我的技术站。

https://myquotego.com/html/questions?_from=csdn_123_1


二、技术原理解析

1. synchronized 的底层原理

synchronized 是 JVM 提供的内置锁(Intrinsic Lock / Monitor)

关键点:

  • 每个对象都有一个Monitor(监视器)

  • synchronized 分为两种形式:

    1. 实例方法:锁住当前对象this
    2. 静态方法:锁住 Class 对象

JVM 内部实现:

  • HotSpot 会对锁进行锁优化

  • 锁状态:

    • 无锁
    • 偏向锁
    • 轻量级锁
    • 重量级锁

通过 CAS 和 Monitor 实现线程安全访问


2. 锁升级机制

锁升级是 JVM 性能优化的重要手段。

锁类型特点使用场景
偏向锁偏向第一个线程,无竞争单线程访问
轻量级锁使用 CAS 尝试获取锁短时间加锁,多线程少竞争
重量级锁阻塞等待高度竞争场景

锁升级是自动的,开发者无需干预,但理解原理有助于面试答题。


3. synchronized 和可见性

synchronized 不仅保证互斥性,还保证可见性

  • 一个线程释放锁前对共享变量的修改
  • 对其他线程是可见的

这是因为:

  • JVM 会在加锁前执行LoadLoad + StoreLoad
  • 解锁时刷新主内存

因此 synchronized 可以替代 volatile,在一定场景下保证可见性和原子性。


我整理了一套完整Java面试题库,
完整版在我的技术站。

https://myquotego.com/html/questions?_from=csdn_123_1


三、代码示例

1. 实例方法加锁

publicclassSynchronizedDemo{privateintcount=0;publicsynchronizedvoidincrement(){count++;}publicintgetCount(){returncount;}publicstaticvoidmain(String[]args)throwsInterruptedException{SynchronizedDemodemo=newSynchronizedDemo();Runnabletask=()->{for(inti=0;i<10000;i++){demo.increment();}};Threadt1=newThread(task);Threadt2=newThread(task);t1.start();t2.start();t1.join();t2.join();System.out.println("最终结果:"+demo.getCount());}}

运行结果总是20000,保证了线程安全。


2. 静态方法加锁

publicclassStaticLockDemo{privatestaticintcount=0;publicstaticsynchronizedvoidincrement(){count++;}publicstaticintgetCount(){returncount;}}
  • 锁住的是StaticLockDemo.class
  • 所有实例共享同一把锁

3. 同步代码块

publicclassBlockLockDemo{privateintcount=0;publicvoidincrement(){synchronized(this){count++;}}}
  • 可以缩小锁的粒度
  • 提升性能
  • 避免不必要的阻塞

四、实际应用场景

  1. 银行转账、余额修改

    • 保证账户操作原子性
  2. 缓存更新

    • 防止多线程同时写入导致脏数据
  3. 单例模式

    • 双重检查锁实现线程安全的懒加载
  4. 队列/堆栈操作

    • 防止数据结构在多线程下破坏

五、注意事项

  • 避免死锁

    • 加锁顺序要一致
    • 尽量减少嵌套锁
  • 锁粒度优化

    • 代码块比方法锁更高效
  • 高竞争场景考虑替代方案

    • ReentrantLock 或 CAS

我整理了一套完整Java面试题库,
完整版在我的技术站。

https://myquotego.com/html/questions?_from=csdn_123_1


六、总结

面试关键点:

  1. synchronized 是 JVM 内置锁,保证互斥性和可见性
  2. 支持实例方法、静态方法和同步代码块
  3. JVM 会自动优化锁,存在偏向锁、轻量级锁、重量级锁
  4. 锁升级机制和锁粒度优化是面试加分项
  5. 注意死锁和高竞争场景的性能问题

如果能在面试中结合锁原理 + 升级机制 + 代码示例回答:

你就真正掌握了 synchronized!


关注我,持续更新Java面试核心知识。

http://www.jsqmd.com/news/617233/

相关文章:

  • OpenCore Legacy Patcher:让老款Mac焕发新生的完整实战教程
  • Z-Image-GGUF高级教程:使用Ollama本地化部署与管理模型
  • 基于Hunyuan-MT-7B的Web多语言翻译服务开发
  • SEC Insights 后端技术栈详解:FastAPI + SQLAlchemy + PGVector 集成方案
  • FUXA工业监控平台架构设计:构建现代化SCADA系统的技术洞察
  • 广西有哪些性价比高的全自动液体压力校验台企业推荐 - 工业品网
  • Ollama+Qwen2.5-VL-7B实战:搭建你的私人视觉AI助手,开箱即用
  • DownKyi终极指南:解锁B站视频下载的5个关键技巧
  • 2026年口碑好的LED透镜和激光透镜服务店排名,河南佳和轩实力上榜 - 工业品牌热点
  • StructBERT模型与Transformer架构解析:从原理到WebUI部署
  • 3步终极解决JetBrains IDE试用期重置难题:ide-eval-resetter完整指南
  • 向华为学习——详解130页集成产品开发(IPD)实践:战略、流程与组织的协同之道【附全文阅读】
  • 2026年内蒙古地区YZH系列便携式微压泵品牌推荐,好用又靠谱 - 工业设备
  • 全国范围内比较不错的汽车灯光升级专业公司有哪些? - 工业推荐榜
  • nli-distilroberta-baseAI应用:作为大模型Agent的‘逻辑守门员’拦截无效推理链
  • 百度网盘提取码智能获取工具:告别繁琐搜索的终极解决方案
  • Qwen3-4B Instruct-2507效果实测:金融研报关键信息抽取准确率达89.4%
  • 华珠计算机第三次作业
  • 一行代码实现读取文件内容并进行清理和分割
  • 如何用本地AI工具高效提取视频硬字幕?Video-subtitle-extractor完整指南
  • 2026年河南汽车灯光升级店排名,佳和轩专业靠谱值得推荐 - myqiye
  • 从传统Java到AI应用开发:我的转型之路与实战指南
  • G-Helper完整指南:如何用轻量工具彻底掌控你的华硕笔记本
  • vLLM-v0.17.1行业落地:制造业设备故障日志分析与维修建议生成系统
  • qmc-decoder:快速解密QQ音乐加密音频的终极解决方案
  • 网盘直链下载助手:告别限速烦恼的终极指南
  • Qwen3-14B GPU算力优化部署:显存占用降低35%,推理提速30%实测
  • 51初学者——从数据手册到串口通信(UART)
  • 阶跃星辰Step3-VL-10B实战:AR眼镜实时画面流→物体识别→语音播报指令生成
  • 天津申强钢铁作为耐候钢制造厂产品质量好吗 - mypinpai