《互联网大厂Java面试:核心知识大考验》

101 阅读4分钟

面试官:请简要介绍一下Java中的多线程。

王铁牛:多线程就是一个程序里可以同时执行多个线程呗,比如我开一个线程去下载文件,再开一个线程去处理其他任务。

面试官:那线程池你了解吗?它有什么作用?

王铁牛:线程池就是预先创建一些线程,有任务来了就从线程池里拿线程去执行,能提高线程创建和销毁的效率。

面试官:很好,回答正确。接下来问你几个关于JVM的问题。类加载机制有哪几个阶段?

王铁牛:嗯……有加载、验证、准备、解析、初始化这几个阶段。

面试官:那什么是双亲委派模型?

王铁牛:这个嘛,就是类加载器收到加载请求时,先把请求委托给父类加载器,父类加载器能完成就完成,不能完成才自己去加载。

面试官:还不错。最后一轮,说说Spring框架中IoC和AOP的概念。

王铁牛:IoC就是控制反转,把对象的创建和依赖关系管理交给Spring容器。AOP就是面向切面编程,能把一些通用功能比如日志、事务等抽离出来。

面试官:好的,你的面试就到这里,回家等通知吧。

答案:

  • 多线程:多线程是指在一个程序中可以同时执行多个线程。线程是程序执行的最小单元,通过多线程可以实现并发执行,提高程序的效率。例如,在一个下载文件的程序中,可以同时开启一个线程进行文件下载,另一个线程处理用户界面的交互,让用户在下载过程中仍能进行其他操作。
  • 线程池:线程池是一种预先创建一定数量线程的机制。当有任务到来时,从线程池中获取线程去执行任务,任务执行完毕后线程不会立即销毁,而是放回线程池供下次使用。这样可以避免频繁创建和销毁线程带来的开销,提高系统性能。比如在一个高并发的服务器应用中,使用线程池可以高效地处理大量客户端请求。
  • JVM类加载机制阶段:
    • 加载:通过类的全限定名获取定义此类的二进制字节流,并将其存入方法区,然后在堆中创建一个Class对象,用来封装类在方法区的数据结构。
    • 验证:确保加载的类信息符合JVM规范,不会危害虚拟机安全。
    • 准备:为类的静态变量分配内存,并设置默认初始值。
    • 解析:将常量池内的符号引用替换为直接引用。
    • 初始化:执行类构造器()方法,为类的静态变量赋予正确的初始值。
  • 双亲委派模型:类加载器收到类加载请求时,不会立即自己去加载,而是把请求委托给父类加载器。父类加载器按照同样的规则依次向上委托,直到最顶层的启动类加载器。如果父类加载器能完成加载任务,就由父类加载器加载;如果父类加载器无法完成,才由自身去加载。这样可以保证类的加载顺序和安全性,避免重复加载。
  • Spring的IoC(控制反转):控制反转是指将对象的创建和对象之间的依赖关系管理从应用程序代码中分离出来,交给Spring容器来管理。在传统的开发中,对象之间的依赖关系由程序员在代码中直接创建和维护,而IoC则是让Spring容器根据配置文件或注解来创建对象并注入依赖关系,降低了对象之间的耦合度,提高了代码的可维护性和可测试性。
  • Spring的AOP(面向切面编程):面向切面编程是一种编程范式,它允许开发者将一些横切关注点(如日志记录、事务管理、权限验证等)从业务逻辑中分离出来,以一种更灵活和可维护的方式进行处理。通过AOP,可以在不修改原有业务逻辑代码的基础上,动态地为目标对象添加额外的功能。例如,使用AOP可以在方法执行前后自动记录日志,或者在业务方法出现异常时进行统一的事务回滚处理。