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

22 阅读5分钟

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

面试官:请简要介绍一下Java中的多线程机制以及如何创建一个线程。

王铁牛:多线程就是多个线程同时执行嘛。创建线程可以通过继承Thread类或者实现Runnable接口。比如说继承Thread类,重写它的run方法,然后new一个对象调用start方法就启动线程了。

面试官:回答得还不错。那说说线程池的核心参数以及它们的作用。

王铁牛:线程池有几个核心参数,corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。corePoolSize是核心线程数,maximumPoolSize是最大线程数,keepAliveTime是线程在超出核心线程数后,在workQueue满了的情况下,线程在多长时间后会被销毁,unit就是这个时间的单位,workQueue是任务队列,threadFactory是线程工厂,handler是拒绝策略。

面试官:很好。再问一个,简述一下JVM的内存结构。

王铁牛:JVM内存结构包括堆、栈、方法区。堆是存放对象实例的地方,栈是存放局部变量等,方法区存放类信息、常量、静态变量等。

第一轮结束。

面试官:讲讲Spring框架中IoC和AOP的概念。

王铁牛:IoC就是控制反转,把对象的创建和依赖注入交给Spring容器来管理。AOP就是面向切面编程,能在不修改原有代码的基础上,动态地将一些功能切入到方法执行前后等位置。

面试官:那Spring Boot的自动配置原理是什么?

王铁牛:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,它会根据类路径下的依赖来自动配置相关的Bean。

面试官:MyBatis的动态SQL有哪些?

王铁牛:有if、where、trim、choose、when、otherwise、foreach等。

第二轮结束。

面试官:Dubbo的集群容错策略有哪些?

王铁牛:有failover、failfast、failsafe、failback、forking、broadcast。

面试官:RabbitMq的消息确认机制是怎样的?

王铁牛:有生产者确认和消费者确认。生产者确认包括事务机制和发送方确认,消费者确认有自动确认和手动确认。

面试官:xxl-job的执行器有哪些类型?

王铁牛:有单机执行器、集群执行器等。

第三轮结束。

面试官:今天的面试就到这里,回去等通知吧。

答案:

  • 多线程:多线程是指程序中包含多个执行单元,这些执行单元可以并发执行。创建线程的方式主要有两种:继承Thread类,重写run方法,然后通过实例对象调用start方法启动线程;实现Runnable接口,实现其run方法,将实现类实例作为参数传入Thread类的构造函数创建线程对象并调用start方法启动。
  • 线程池核心参数
    • corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
    • maximumPoolSize:最大线程数,当任务数超过corePoolSize且workQueue已满时,会创建新线程直到线程数达到maximumPoolSize。
    • keepAliveTime:线程在超出核心线程数后,在workQueue满了的情况下,线程在多长时间后会被销毁。
    • unit:keepAliveTime的时间单位。
    • workQueue:任务队列,用于存放提交的任务。
    • threadFactory:线程工厂,用于创建线程。
    • handler:拒绝策略,当线程数达到maximumPoolSize且workQueue已满时,用于处理新提交的任务。
  • JVM内存结构
    • :是存放对象实例的地方,是JVM内存中最大的一块区域,也是垃圾回收的主要区域。
    • :存放局部变量、方法调用等信息,每个线程都有自己独立的栈空间。
    • 方法区:存放类信息、常量、静态变量等,被所有线程共享。
  • Spring框架中IoC和AOP
    • IoC(控制反转):把对象的创建和依赖注入交给Spring容器来管理,降低了对象之间的耦合度。
    • AOP(面向切面编程):能在不修改原有代码的基础上,动态地将一些功能切入到方法执行前后等位置,比如日志记录、事务管理等。
  • Spring Boot自动配置原理:通过@EnableAutoConfiguration注解开启自动配置,它会根据类路径下的依赖来自动配置相关的Bean。Spring Boot会扫描classpath下所有的jar包和配置类,根据这些依赖信息来自动配置合适的组件。
  • MyBatis动态SQL
    • if:根据条件判断动态拼接SQL语句。
    • where:智能处理SQL语句中的where子句,避免多余的and。
    • trim:可以灵活地添加或删除前缀、后缀等。
    • choose、when、otherwise:类似于Java中的switch语句,根据条件选择执行相应的when子句。
    • foreach:用于循环遍历集合,动态生成SQL语句中的in条件等。
  • Dubbo集群容错策略
    • failover:失败自动切换,当调用失败后会自动重试其他服务器。
    • failfast:快速失败,一旦调用失败立即报错。
    • failsafe:失败安全,调用失败后不抛出异常,直接忽略。
    • failback:失败后自动恢复,失败后会定时重试。
    • forking:并行调用多个服务器,只要有一个成功就返回。
    • broadcast:广播调用所有服务器,逐个调用,任意一个报错则报错。
  • RabbitMq消息确认机制
    • 生产者确认
      • 事务机制:通过channel.txSelect开启事务,通过channel.txCommit提交事务,通过channel.txRollback回滚事务。
      • 发送方确认:通过channel.confirmSelect开启发送方确认,消息发送后通过addConfirmListener监听确认结果。
    • 消费者确认
      • 自动确认:消费者接收到消息后自动确认,消息会被立即从队列中移除。
      • 手动确认:消费者接收到消息后,需要手动调用channel.basicAck方法进行确认,可批量确认等。
  • xxl-job执行器类型
    • 单机执行器:适用于单机部署的场景。
    • 集群执行器:用于集群部署,支持任务分片、负载均衡等功能。