Java大厂面试全覆盖:30+并发高频面试题详解(含腾讯/阿里/美团/百度真题)
1. 什么是进程和线程?
考察知识点:并发基础。
进程是操作系统分配资源的基本单位,线程是CPU调度的最小单位。一个进程可以包含多个线程,线程间资源共享,进程间资源独立。
2. 线程的生命周期有哪些阶段?
考察知识点:线程状态。
包括新建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、等待(waiting)、超时等待(timed waiting)、终止(terminated)。
3. Java创建线程的方式有哪些?
考察知识点:线程创建。
常见三种方式:继承Thread类、实现Runnable接口、实现Callable接口结合Future。推荐用Runnable/Callable,代码解耦、可扩展。
4. Runnable和Callable的区别?
考察知识点:任务接口。
Runnable无返回值、不能抛异常;Callable有返回值且可抛异常。Callable常结合Future使用。
5. 线程的run()和start()方法区别?
考察知识点:线程启动原理。
start()启动新线程并调用run(),run()仅是普通方法,直接调用不会新启线程。
6. 线程的同步和异步?
考察知识点:并发协作。
同步指多线程协作时需要等待,常见如synchronized、Lock;异步不需要等待,可并发执行,常用线程池、回调等实现。
7. synchronized的底层原理?
考察知识点:锁机制。
synchronized基于JVM对象监视器实现互斥锁,保证线程安全。JVM通过对象头Mark Word和monitor来实现锁的获取与释放。
8. Java中有哪些锁?
考察知识点:锁的分类。
包括偏向锁、轻量级锁、重量级锁、可重入锁(ReentrantLock)、读写锁(ReadWriteLock)、自旋锁、悲观锁、乐观锁等。
9. 可重入锁的原理?
考察知识点:锁重入性。
可重入锁允许同一线程多次获取同一把锁,避免死锁。synchronized和ReentrantLock都是可重入锁。
10. volatile关键字的作用?
考察知识点:可见性与有序性。
volatile保证变量对多线程可见性,禁止指令重排序,不保证原子性。
11. 为什么说volatile不保证原子性?
考察知识点:原子性。
volatile仅保证可见性。i++等复合操作不是原子操作,仍需synchronized或原子类保证原子性。
12. 什么是CAS?
考察知识点:无锁并发。
CAS(Compare And Swap)是一种乐观锁机制,通过比较内存中的值与期望值一致时更新,常用于原子类实现。
13. ABA问题及其解决方案?
考察知识点:CAS缺陷。
ABA问题指CAS判断值未变但实际已被修改过。可用AtomicStampedReference等带版本号的原子类解决。
14. Java内存模型(JMM)?
考察知识点:并发内存可见性。
JMM定义了主内存与线程工作内存,保证多线程间内存可见性与有序性。理解JMM是并发编程基础。
15. happens-before原则?
考察知识点:内存可见性。
happens-before约定了操作之间的可见性和顺序性,比如synchronized块、volatile变量写-读、线程启动前-后关系等。
16. 死锁的四个必要条件?
考察知识点:死锁原理。
互斥、占有且等待、不剥夺、循环等待。任一条件被破坏即可避免死锁。
17. 如何避免死锁?
考察知识点:死锁预防。
破坏循环等待、资源分配有序、使用定时锁等。
18. wait和sleep的区别?
考察知识点:线程阻塞。
wait释放锁并进入等待池,需notify唤醒;sleep不释放锁,时间到自动恢复。wait属于Object,sleep属于Thread。
19. notify与notifyAll区别?
考察知识点:线程唤醒。
notify随机唤醒一个等待线程,notifyAll唤醒所有等待线程。推荐用notifyAll避免假死。
20. ThreadLocal的作用和原理?
考察知识点:线程本地变量。
ThreadLocal为每个线程提供独立变量副本,适合存储线程独享数据,底层用ThreadLocalMap实现。
21. 线程池的核心参数?
考察知识点:线程池配置。
包括核心线程数、最大线程数、空闲线程存活时间、阻塞队列、线程工厂、拒绝策略。合理配置提升并发性能。
22. 线程池的常用实现?
考察知识点:Executor框架。
常用有FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool,底层均用ThreadPoolExecutor实现。
23. 线程池的工作原理?
考察知识点:任务提交与调度。
线程池通过复用线程执行任务,任务先入队列,线程空闲时取出执行,减少线程创建销毁开销。
24. Callable和Future的配合?
考察知识点:异步任务管理。
Callable可返回结果,Future用于获取任务执行结果与异常,可用于异步编程。
25. CountDownLatch与CyclicBarrier区别?
考察知识点:并发协作工具。
CountDownLatch用于一个线程等待多个线程完成,CyclicBarrier用于多个线程互相等待,适合不同场景。
26. Semaphore的作用?
考察知识点:限流。
Semaphore信号量用于控制并发线程数量,常用于流量控制、连接池。
27. ReadWriteLock原理?
考察知识点:读写分离锁。
ReadWriteLock允许多读单写,提高并发性能。典型实现是ReentrantReadWriteLock。
28. ReentrantLock与synchronized的区别?
考察知识点:锁机制对比。
ReentrantLock功能更强,支持公平锁/非公平锁、可中断、定时锁、条件变量。synchronized易用,但功能较弱。
29. Condition的作用?
考察知识点:线程通信。
Condition配合ReentrantLock实现更灵活的wait/notify机制,可支持多条件队列,功能强于Object的wait/notify。
30. CopyOnWriteArrayList原理?
考察知识点:写时复制。
写时复制容器,写操作复制新数组,读操作无锁,适合读多写少场景。
31. ConcurrentHashMap的实现原理?
考察知识点:并发集合。
JDK8前基于分段锁,JDK8后采用CAS+Synchronized,保证高并发安全和效率。
32. FutureTask的作用?
考察知识点:任务封装。
FutureTask实现了Runnable和Future接口,可通过线程池或Thread运行,用于异步任务执行和结果获取。
33. Fork/Join框架原理?
考察知识点:并行计算。
Fork/Join采用工作窃取算法,适合大任务拆分。可充分利用多核处理器,提升计算效率。
以上题目涵盖了大厂Java并发高频与基础知识点,建议结合源码和实际项目深入理解并掌握,知其然且知其所以然,助力高分通过面试!