Java并发编程是Java开发中的重要领域,特别是在大型企业级应用和服务器端开发中不可或缺。面试时,面试官经常考察候选者对于并发控制、线程安全、性能优化等关键概念的理解和实践经验。本资料集旨在帮助求职者准备Java并发编程相关的面试问题。
1. **线程与进程**
- **线程定义**:线程是程序执行的最小单位,一个进程中可以有多个线程并发执行。
- **进程定义**:进程是资源分配的基本单位,每个进程拥有独立的内存空间。
- **线程与进程的区别**:线程共享进程的内存空间,而进程之间内存相互独立;线程创建和销毁的开销小,切换更快。
2. **Java并发基础**
- **Thread类**:Java中的线程是通过继承Thread类或实现Runnable接口来创建的。
- **守护线程(Daemon)**:用于后台服务,不阻塞程序退出。
- **线程状态**:新建、就绪、运行、阻塞和死亡。
3. **并发控制**
- **同步机制**:synchronized关键字,互斥锁,保证同一时刻只有一个线程访问临界区。
- **wait/notify机制**:Object类中的wait()、notify()和notifyAll()方法,用于线程间通信。
- **volatile关键字**:保证变量在多线程环境下的可见性,但不保证原子性。
- **Lock接口**:ReentrantLock、ReentrantReadWriteLock等,提供更细粒度的控制,支持公平锁和非公平锁。
4. **并发集合**
- **线程安全的集合**:Vector、Collections.synchronizedList()、ConcurrentHashMap等。
- **并发容器**:CopyOnWriteArrayList、ConcurrentLinkedQueue、LinkedBlockingQueue等,适用于高并发读取场景。
5. **并发工具类**
- **CountDownLatch**:计数器,用于多线程协同工作,计数到零后所有线程继续执行。
- **CyclicBarrier**:回环栅栏,一组线程等待其他线程到达某个点后再一起执行。
- **Semaphore**:信号量,限制同时访问特定资源的线程数量。
- **ThreadPoolExecutor**:线程池,管理和调度线程,提高性能并避免资源浪费。
6. **原子操作与原子类**
- **Atomic包**:如AtomicInteger、AtomicLong等,提供原子操作,保证在无同步情况下也能实现线程安全。
7. **死锁、活锁与饥饿**
- **死锁**:两个或更多线程互相等待对方释放资源,导致都无法继续执行。
- **活锁**:线程不断重试导致无法继续执行,但没有发生资源占用。
- **饥饿**:某线程因为其他线程持有资源一直无法获取,导致无法执行。
8. **JVM内存模型与线程**
- **Java内存模型(JMM)**:规范了线程之间的交互和内存可见性问题。
- **工作内存与主内存**:线程有自己的工作内存,共享数据在主内存中。
9. **线程池的最佳实践**
- **线程池大小**:根据系统资源和任务特性确定合适的线程池大小。
- **拒绝策略**:设置合适的拒绝策略,如AbortPolicy、CallerRunsPolicy等。
10. **并发性能优化**
- **减少上下文切换**:避免过度创建和销毁线程,使用线程池。
- **合理使用并发工具**:根据场景选择合适的数据结构和并发控制手段。
- **避免长时间阻塞**:及时响应中断请求,避免线程长时间等待。
这些知识点涵盖了Java并发编程的主要方面,深入理解并能灵活运用它们将有助于在面试中展现出扎实的并发编程能力。