Java面试题更新 2026-08-05

在Java并发编程中,volatile关键字和synchronized关键字在保证线程安全方面有何不同?请从内存可见性、原子性、操作粒度以及使用场景等角度进行比较。

技术原理方案权衡Java

考察说明

考察对Java并发中两种同步机制差异的理解,以及在实际场景中的选择能力。

回答思路

  1. 【回答框架 1】volatile关键字主要用于保证变量的内存可见性,它确保一个线程对变量的修改能立即被其他线程看到,但它不保证操作的原子性,例如i++这种复合操作。
  2. 【回答框架 2】synchronized关键字则能够保证原子性和可见性,它通过加锁机制确保同一时刻只有一个线程执行临界区代码,同时释放锁时会将修改同步到主内存。
  3. 【回答框架 3】从操作粒度看,volatile只能作用于变量,而synchronized可以作用于方法或代码块,粒度更粗。
  4. 【回答框架 4】在适用场景上,volatile适合用于状态标志位或单次写入多次读取的变量;synchronized适合用于需要原子操作的复合操作或保护多个变量的一致性。
  5. 【回答框架 5】选择时需权衡性能,volatile开销较低,而synchronized可能涉及锁的竞争和上下文切换,但能提供更强的保证。
  6. 【关键点 1】volatile保证可见性,不保证原子性;synchronized保证可见性和原子性。
  7. 【关键点 2】volatile适用于单写多读场景,synchronized适用于复合操作。
  8. 【关键点 3】volatile开销低,synchronized可能引发线程阻塞和性能下降。
  9. 【易错点 1】错误地认为volatile能保证原子性,如对volatile变量进行i++操作仍可能数据不一致。
  10. 【易错点 2】过度使用synchronized导致性能瓶颈,应合理划分锁粒度。
  11. 【易错点 3】在需要复合原子操作时误用volatile,导致并发问题。