Java面试题更新 2026-08-05

Java 中线程之间如何进行通信?请说明常见机制及其适用场景。

技术原理方案权衡Java

考察说明

考查对Java并发中线程间通信机制的理解与辨析

回答思路

  1. 【回答框架 1】线程间通信的本质是共享可变状态的可见性与线程协作控制,Java提供基于内存模型(volatile、synchronized、锁)和显式协调(wait/notify、Condition、并发工具类、阻塞队列)两类机制。第一类保证可见性与互斥,第二类实现线程间的等待/通知与任务传递。
  2. 【回答框架 2】volatile通过内存屏障保证可见性,但不保证原子性,适用于多线程读写单一状态标志位;synchronized和Lock通过互斥保证原子性,并利用内置条件队列或Condition实现等待/通知,适合保护共享变量和实现生产者消费者模式。
  3. 【回答框架 3】并发工具类如CountDownLatch、CyclicBarrier、Semaphore用于线程间的协作同步,Callable+Future/FutureTask可获取子线程计算结果;阻塞队列(如LinkedBlockingQueue)天然实现生产者消费者模型,降低手工同步的复杂度。
  4. 【回答框架 4】选择机制需根据场景:简单状态同步用volatile或Atomic类;临界区保护用锁;等待通知用wait/notify或Condition;线程协作与结果获取用工具类;数据传递优先考虑阻塞队列。注意wait/notify需在同步块内使用并处理虚假唤醒。
  5. 【回答框架 5】线程通信最终依赖JMM(Java内存模型)的happens-before规则,如锁释放与获取、volatile读写、线程启动与join等建立顺序保证,避免指令重排带来的可见性问题。
  6. 【关键点 1】volatile保证可见性但不保证原子性,Lock与synchronized提供互斥并支持等待通知
  7. 【关键点 2】wait/notify必须在同步块中调用,且需在循环中检查条件以应对虚假唤醒
  8. 【关键点 3】Condition比内置wait/notify更灵活,支持多个等待队列
  9. 【关键点 4】阻塞队列简化生产者消费者模型,CountDownLatch等工具类负责线程协作
  10. 【关键点 5】Future获取子线程结果时,get()会阻塞直到任务完成
  11. 【易错点 1】将volatile误用于复合操作(如i++),导致原子性问题
  12. 【易错点 2】忽略虚假唤醒,条件判断用if而非while,可能产生逻辑错误
  13. 【易错点 3】在线程间共享可变数据时不加同步,依赖时序,造成数据竞争和可见性问题