Java多线程常见面试题

Java多线程高频面试题及答案1. 线程与进程的区别?答:- 进程:资源分配的基本单位,独立内存空间,进程间通信复杂(如管道、Socket)。- 线程:CPU调度的基本单位,共享进程内存,通信高效(但需处理同步问题)。 2. 创建线程的几种方式?答:- 继承 [代码] 类并重写 [代码] 方法。- 实现 [代码] 接…

作者:TaotaoYao

Java多线程高频面试题及答案


1. 线程与进程的区别?

答:

- 进程:资源分配的基本单位,独立内存空间,进程间通信复杂(如管道、Socket)。

- 线程:CPU调度的基本单位,共享进程内存,通信高效(但需处理同步问题)。  


2. 创建线程的几种方式?

答:

- 继承 Thread 类并重写 run() 方法。

- 实现 Runnable 接口(推荐,避免单继承限制)。

- 实现 Callable 接口(支持返回值,需配合 FutureTask)。

- 通过线程池创建(如 ExecutorService)。  


3. Runnable vs Callable?

答:

- Runnablerun() 无返回值,不抛异常。

- Callablecall() 可返回结果或抛异常,需配合 Future 获取返回值。  


4. 线程的6种状态(生命周期)?

答:
NEW(新建) → RUNNABLE(就绪/运行) → BLOCKED(锁阻塞) → WAITING(无限等待) → TIMED_WAITING(限时等待) → TERMINATED(终止)。  


5. synchronized 的作用?

答:

- 修饰实例方法:锁住当前对象实例。

- 修饰静态方法:锁住当前类的Class对象。

- 修饰代码块:需显式指定锁对象(如 synchronized(obj))。  


6. volatile 关键字的作用?

答:

- 保证可见性:强制线程从主内存读取最新值(避免缓存一致性问题)。

- 禁止指令重排:通过内存屏障实现(如单例模式的双重检查锁需用 volatile)。  


7. 线程池的核心参数?

答:
ThreadPoolExecutor 七大参数:

- corePoolSize:核心线程数(常驻线程)。

- maximumPoolSize:最大线程数(临时线程)。

- workQueue:任务队列(如 ArrayBlockingQueue)。

- keepAliveTime:临时线程空闲存活时间。

- unit:存活时间单位。

- threadFactory:线程工厂(定制线程名等)。

- handler:拒绝策略(如 AbortPolicy 抛异常)。  


8. 死锁的产生条件及避免方案?

答:
必要条件:

1. 互斥访问

2. 持有并等待

3. 不可剥夺

4. 循环等待  

避免方案:

- 破坏条件:如按序申请锁、设置超时时间(tryLock)、检测死锁并回滚。  


9. ThreadLocal 原理及内存泄漏风险?

答:

- 原理:每个线程内部维护 ThreadLocalMap,以 ThreadLocal 为Key存储数据。

- 内存泄漏:Key 是弱引用,但 Value 是强引用。需手动 remove() 避免泄漏。  


10. sleep() vs wait() 的区别?

答:

- sleep():释放CPU时间片,不释放锁,属于 Thread 类方法。

- wait():释放锁并进入等待,需 notify() 唤醒,属于 Object 类方法。  


11. 乐观锁的实现(如CAS)?

答:

- CAS(Compare And Swap):通过 Unsafe 类调用CPU指令(如 cmpxchg),比较内存值是否与预期一致,若一致则更新。

- 示例AtomicIntegerincrementAndGet() 方法。  


附录:高频延伸问题

  • 如何保证多线程顺序执行?(join()/CountDownLatch/单线程池)  
  • ConcurrentHashMap 的实现原理?  
  • synchronized 锁升级过程(偏向锁→轻量级锁→重量级锁)?  
  • AQS(AbstractQueuedSynchronizer)工作原理?  

提示:结合实际代码示例理解答案,并重点掌握线程同步、池化技术及并发工具类(如JUC包)。