Java面试深度解析:集合、多线程、JVM与并发

需积分: 5 0 下载量 16 浏览量 更新于2024-08-03 收藏 114KB DOCX 举报
"Java面试题集,涵盖Java基础、并发编程、JVM、设计模式、性能优化等多个方面" 1. **乐观悲观锁**:乐观锁假设很少发生冲突,因此在读取数据时不加锁,而在更新时检查是否被其他线程修改过。悲观锁则相反,假设会发生冲突,在读取数据时就加锁。Java中,`乐观锁`常通过版本号或CAS(Compare and Swap)实现,`悲观锁`如`synchronized`关键字。 2. **原子性**:Java中的`synchronized`、`volatile`和`Atomic`类可以保证操作的原子性,防止数据在多线程环境中的不一致。 3. **内存分布**:`char`占2字节,`double`占8字节。在内存中,对象存储在堆上,基本类型和引用在栈上,对于数组,其元素在堆上。 4. **对象死亡过程**:包括可达性分析、 finalize 方法执行、垃圾收集器清理。 5. **对象头**:对象头包含Mark Word(用于锁状态、GC标记等)、Class Pointer(指向类元数据的指针)。 6. **synchronized原理**:保证同一时间只有一个线程访问同步代码块,内部异常会释放锁,避免死锁。排查死锁通常使用`jstack`命令,死锁会导致线程永久等待。替代方案如使用`ReentrantLock`。 7. **集合线程安全**:`HashSet`非线程安全,`HashMap`同样,但`ConcurrentHashMap`是线程安全的。若需使它们线程安全,可使用`synchronized`修饰或者使用并发集合。 8. **多线程解决的问题**:提高程序运行效率,利用多核CPU资源。线程池解决了频繁创建销毁线程的开销,提供线程复用。 9. **线程池设计**:线程池参数包括核心线程数、最大线程数、工作队列(如ArrayBlockingQueue、LinkedBlockingQueue等)和超时策略。设计线程池需考虑任务类型、系统资源、性能需求等因素。 10. **AQS(AbstractQueuedSynchronizer)**:是Java并发包中的基础组件,`ReentrantLock`和`Semaphore`等依赖它实现同步。 11. **JVM内存模型**:包括堆、栈、方法区、本地方法栈、程序计数器,大页模式是为了提高内存访问效率。 12. **敏捷开发**:快速响应变化,强调迭代和增量开发。防御性编程是在编写代码时假设可能会出错,提前预防。并行编程是同时处理多个任务,提高效率。 13. **逃逸分析**:分析对象是否会被外部线程访问,有助于优化如栈分配、锁消除等。 14. **线程安全**:一个类在多线程环境下正确工作的能力。Java中有`synchronized`、`volatile`、`final`等关键字保证线程安全。 15. **线程设计题**:例如使用条件变量或`CountDownLatch`来控制线程执行顺序。 16. **后缀表达式**:也叫逆波兰表示法,利于计算,减少括号使用。中缀表达式转后缀表达式是算法题常考内容。 17. **性能优化**:分析项目中的内存溢出(OOM)和内存泄漏,使用工具如VisualVM、JProfiler等。 18. **抽象方法和类方法**:抽象方法无实现,存在于抽象类中;静态方法属于类,不依赖实例。 19. **Java克隆体系**:涉及到`Cloneable`接口和`clone()`方法,浅拷贝和深拷贝的概念。 20. **触发类加载**:类加载器根据需要加载类,如首次访问类的静态成员、创建类实例等。 以上只是部分关键知识点的概述,每个话题都包含了大量的理论和实践内容,深入理解需要结合具体实现和实际案例进行学习和探讨。