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

张开发
2026/4/17 14:45:23 15 分钟阅读

分享文章

面试官:你真的理解 synchronized 吗?很多人答错
在 Java 面试中synchronized是高频考点但很多开发者的理解都不够深入。常见误区synchronized 只是让方法加锁synchronized 会影响性能所以尽量少用synchronized 只能用于方法或代码块实际上synchronized 的底层机制、锁升级策略以及与 JVM 结合的实现是面试官重点考察的内容。本文将从问题背景、技术原理、代码示例、实际应用场景、总结全面讲解 synchronized帮助你在面试中脱颖而出。一、问题背景在多线程开发中共享资源是导致线程安全问题的核心。经典问题包括数据竞争Race Condition脏读Dirty Read丢失更新Lost Update例如publicclassCounter{privateintcount0;publicvoidincrement(){count;}}多线程调用increment()时count实际是三条指令读取、加 1、写回多线程同时执行会出现数据不一致解决办法之一就是synchronized。我整理了一套完整Java面试题库完整版在我的技术站。https://myquotego.com/html/questions?_fromcsdn_123_1二、技术原理解析1. synchronized 的底层原理synchronized 是 JVM 提供的内置锁Intrinsic Lock / Monitor。关键点每个对象都有一个Monitor监视器synchronized 分为两种形式实例方法锁住当前对象this静态方法锁住 Class 对象JVM 内部实现HotSpot 会对锁进行锁优化锁状态无锁偏向锁轻量级锁重量级锁通过 CAS 和 Monitor 实现线程安全访问。2. 锁升级机制锁升级是 JVM 性能优化的重要手段。锁类型特点使用场景偏向锁偏向第一个线程无竞争单线程访问轻量级锁使用 CAS 尝试获取锁短时间加锁多线程少竞争重量级锁阻塞等待高度竞争场景锁升级是自动的开发者无需干预但理解原理有助于面试答题。3. synchronized 和可见性synchronized 不仅保证互斥性还保证可见性一个线程释放锁前对共享变量的修改对其他线程是可见的这是因为JVM 会在加锁前执行LoadLoad StoreLoad解锁时刷新主内存因此 synchronized 可以替代 volatile在一定场景下保证可见性和原子性。我整理了一套完整Java面试题库完整版在我的技术站。https://myquotego.com/html/questions?_fromcsdn_123_1三、代码示例1. 实例方法加锁publicclassSynchronizedDemo{privateintcount0;publicsynchronizedvoidincrement(){count;}publicintgetCount(){returncount;}publicstaticvoidmain(String[]args)throwsInterruptedException{SynchronizedDemodemonewSynchronizedDemo();Runnabletask()-{for(inti0;i10000;i){demo.increment();}};Threadt1newThread(task);Threadt2newThread(task);t1.start();t2.start();t1.join();t2.join();System.out.println(最终结果demo.getCount());}}运行结果总是20000保证了线程安全。2. 静态方法加锁publicclassStaticLockDemo{privatestaticintcount0;publicstaticsynchronizedvoidincrement(){count;}publicstaticintgetCount(){returncount;}}锁住的是StaticLockDemo.class所有实例共享同一把锁3. 同步代码块publicclassBlockLockDemo{privateintcount0;publicvoidincrement(){synchronized(this){count;}}}可以缩小锁的粒度提升性能避免不必要的阻塞四、实际应用场景银行转账、余额修改保证账户操作原子性缓存更新防止多线程同时写入导致脏数据单例模式双重检查锁实现线程安全的懒加载队列/堆栈操作防止数据结构在多线程下破坏五、注意事项避免死锁加锁顺序要一致尽量减少嵌套锁锁粒度优化代码块比方法锁更高效高竞争场景考虑替代方案ReentrantLock 或 CAS我整理了一套完整Java面试题库完整版在我的技术站。https://myquotego.com/html/questions?_fromcsdn_123_1六、总结面试关键点synchronized 是 JVM 内置锁保证互斥性和可见性支持实例方法、静态方法和同步代码块JVM 会自动优化锁存在偏向锁、轻量级锁、重量级锁锁升级机制和锁粒度优化是面试加分项注意死锁和高竞争场景的性能问题如果能在面试中结合锁原理 升级机制 代码示例回答你就真正掌握了 synchronized关注我持续更新Java面试核心知识。

更多文章