Java多线程常见面试题
Java多线程高频面试题及答案1. 线程与进程的区别?答:- 进程:资源分配的基本单位,独立内存空间,进程间通信复杂(如管道、Socket)。- 线程:CPU调度的基本单位,共享进程内存,通信高效(但需处理同步问题)。 2. 创建线程的几种方式?答:- 继承 [代码] 类并重写 [代码] 方法。- 实现 [代码] 接…
作者:TaotaoYao
Java多线程高频面试题及答案
1. 线程与进程的区别?
答:
- 进程:资源分配的基本单位,独立内存空间,进程间通信复杂(如管道、Socket)。
- 线程:CPU调度的基本单位,共享进程内存,通信高效(但需处理同步问题)。
2. 创建线程的几种方式?
答:
- 继承 Thread 类并重写 run() 方法。
- 实现 Runnable 接口(推荐,避免单继承限制)。
- 实现 Callable 接口(支持返回值,需配合 FutureTask)。
- 通过线程池创建(如 ExecutorService)。
3. Runnable vs Callable?
答:
- Runnable:run() 无返回值,不抛异常。
- Callable:call() 可返回结果或抛异常,需配合 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),比较内存值是否与预期一致,若一致则更新。
- 示例:AtomicInteger 的 incrementAndGet() 方法。
附录:高频延伸问题
- 如何保证多线程顺序执行?(
join()/CountDownLatch/单线程池) - ConcurrentHashMap 的实现原理?
- synchronized 锁升级过程(偏向锁→轻量级锁→重量级锁)?
- AQS(AbstractQueuedSynchronizer)工作原理?
提示:结合实际代码示例理解答案,并重点掌握线程同步、池化技术及并发工具类(如JUC包)。