2019年Java面试宝典系列|中高级面试题【2】

请分析下,2019年Java面试宝典系列|中高级面试题【2】
最新回答
深碍至白头

2026-06-10 18:15:16

什么是线程死锁?死锁如何产生?如何避免线程死锁?

线程死锁是指当两个或多个线程因互相持有对方所需的资源而陷入等待状态,导致无法继续执行。当一个线程进入对象的synchronized代码块时,它会占有资源,直到退出代码块或调用wait方法才会释放资源。若线程间互相持有对方所需的资源,它们将互等对方释放资源,若线程均不主动释放所占资源,将产生死锁。

死锁的产生条件包括:资源互斥使用、占有且等待、不可抢占和循环等待。避免死锁的方法有:1. 加锁顺序:确保所有线程都按照相同的顺序获取锁,以避免死锁。2. 加锁时限:设定超时时间,线程未能在给定时间内获取所有所需锁则回退并释放已获取锁,然后随机等待后重试,但可能在高并发场景下重复尝试。3. 死锁检测:在每次线程获取锁时记录锁和线程关系,检测是否有循环等待关系。

notify和notifyAll的区别是:notify作用于等待某对象的单个线程,使其退出wait状态;notifyAll使所有在该对象上等待的线程退出wait状态,成为等待该对象锁的竞争者。

MySQL InnoDB引擎是关键存储引擎,支持ACID事务和参数完整性。它在MySQL5.5.5后成为默认存储引擎。其特点包括:支持事务一致性、支持外键约束、并行查询优化、自动表锁管理和行级锁定机制。

事务的隔离级别决定了并发操作时数据一致性保证的严格程度,隔离级别越高,数据一致性保证越强,但性能消耗越大。常见隔离级别包括:读未提交、读已提交、可重复读和序列化隔离。

MySQL主从同步基于主服务器的二进制日志跟踪,主服务器记录所有数据库更改,从服务器通过复制日志内容实现数据同步。主从同步过程需要开启三个线程:bin-log日志记录、复制日程管理和数据同步。

Java中垃圾回收机制在对象生命周期结束时自动执行内存清理。GC何时开始:在Eden区满时执行Minor GC;老年代空间不足时执行Full GC或HandlePromotionFailure参数强制执行。GC操作包括:清理无用对象、整理内存。

垃圾回收器类型和算法、类的加载过程、GC对对象的影响以及Spring中Bean的作用域和生命周期。

Spring中Bean的作用域包括:singleton(单例,全局共享一个实例);prototype(每个请求创建新实例);request(一次请求一个实例);session(一次会话一个实例);global Session(portlet上下文一个实例)。

Spring的Bean生命周期管理包括初始化、使用、卸载等阶段。

依赖注入方式有构造方法注入和设值注入,分别在实例化时和实例化后注入依赖。

Spring框架应用的设计模式包括IoC、AOP、MVC等。

BeanFactory和ApplicationContext的区别在于:BeanFactory提供基础容器功能,而ApplicationContext提供额外功能,如国际化、事件处理等。

数据库三大范式定义:第一范式(唯一性)要求数据不可分割;第二范式(唯一性+依赖性)要求属性完全依赖主键;第三范式(消除冗余)要求所有非主键列仅依赖主键。

TCP和UDP的区别在于:TCP提供可靠字节流服务,UDP提供无连接数据报服务。它们的适用场景:TCP适用于需要可靠传输的应用,如文件传输、邮件等;UDP适用于实时通信、广播等对可靠性要求较低的应用。

Spring核心模块包括:核心容器、面向切面编程、Web MVC、数据访问/集成、测试。

forward与redirect的区别在于:forward在服务器内部转发请求,不会产生新的HTTP请求;redirect通过HTTP重新发送请求,会生成新的URL。

Redis常用数据类型:String(键值对)、Hash(键值集合)、List(有序列表)、Set(无序集合)、Zset(有序集合)。

内部类和静态内部类的区别在于:内部类依赖外部类,静态内部类完全独立。

非静态内部类不能有静态成员的原因在于:静态成员在类加载时创建,非静态内部类实例化时才加载,二者加载时间不同,调用静态成员可能引起冲突。

String、StringBuilder和StringBuffer的区别在于:String是不可变字符串,StringBuilder和StringBuffer是可变字符串,但StringBuffer线程安全。

集合与数组转换方法:数组转集合使用List集合构造器,集合转数组使用toArray方法。

面向对象特征包括封装、继承、多态。

线程状态包括:新建、就绪、运行、阻塞、死亡。

Java集合类基本接口有:Collection、Set、List、Map。

Iterator和ListIterator区别在于:Iterator遍历集合,ListIterator支持集合的增删改。

Enumeration和Iterator区别在于:Iterator更通用,支持并发操作,而Enumeration不支持。

HTTP响应结构包括:状态行、消息头、空行、响应正文。

请求报文由请求行、请求头、空行、请求正文组成;响应报文由状态行、消息头、空行、响应正文组成。

final、finalize和finally的区别在于:final修饰变量不可更改;finalize在对象回收前调用,无保证执行时机;finally用于异常处理,确保代码块执行。

进程间通信方式包括:管道、共享内存、消息队列、信号量。