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

面试官:请简要介绍一下Java中的多线程机制以及它在实际业务场景中的应用。

王铁牛:多线程就是一个程序里可以同时运行多个线程呗。在业务场景里,比如电商抢购,多个用户同时抢商品,就可以用多线程来处理。

面试官:那说说线程池吧,它的核心参数有哪些,以及如何合理配置这些参数?

王铁牛:线程池核心参数有corePoolSize、maximumPoolSize、keepAliveTime这些。配置的话,得根据任务类型和数量来,任务多就把线程池设置大点儿。

面试官:请详细讲讲HashMap的底层实现原理。

王铁牛:嗯……它好像是用数组和链表啥的,具体咋实现的我不太清楚。

第一轮结束,接下来第二轮。

面试官:谈谈Spring框架中依赖注入的几种方式及其区别。

王铁牛:有构造器注入、setter注入,还有接口注入。区别就是注入的时机不太一样。

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

王铁牛:这个……大概就是能自动配置一些东西吧,具体咋回事儿我也说不太明白。

面试官:MyBatis的缓存机制是怎样的?

王铁牛:缓存机制啊,好像有一级缓存和二级缓存,一级缓存是SqlSession级别的,二级缓存是mapper级别的。

第二轮结束,进入第三轮。

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

王铁牛:好像有failover、failfast这些,具体作用我就不太清楚了。

面试官:讲讲RabbitMq的消息确认机制。

王铁牛:消息确认机制?这个我不太熟,就听说过有个啥确认模式。

面试官:xxl-job的核心组件有哪些,以及它们的作用?

王铁牛:核心组件……我只知道有调度中心,其他的不太清楚。

面试结束。王铁牛在面试过程中,对于一些简单问题能够回答上来,展现了一定的基础。但对于复杂问题,回答得比较模糊和混乱,缺乏深入的理解。整体表现有待提高,技术能力还有较大的提升空间。能否通过面试,我们会综合评估后再给通知,请回家耐心等待。

答案:

  1. Java多线程机制:Java中的多线程是指在一个程序中可以同时运行多个线程。每个线程都有自己独立的执行路径,它们可以并发执行,提高程序的执行效率。在实际业务场景中,多线程可用于处理并发任务,比如电商抢购场景,多个用户同时抢购商品,使用多线程可以同时处理多个用户的请求,提高系统的并发处理能力。
  2. 线程池核心参数及配置
    • corePoolSize:线程池的核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
    • maximumPoolSize:线程池允许的最大线程数,当提交的任务数大于corePoolSize且队列已满时,会创建新线程直到线程数达到maximumPoolSize。
    • keepAliveTime:线程池中非核心线程的存活时间,当线程空闲时间超过keepAliveTime时,非核心线程会被销毁。
    • 合理配置:需要根据任务的类型和数量来合理配置。如果任务是CPU密集型的,线程数不宜设置过多,否则会导致线程上下文切换开销过大;如果任务是I/O密集型的,可以适当增加线程数。例如,对于一个电商系统中处理用户下单的任务,可能是I/O密集型的,就可以适当增大线程池的参数,以提高并发处理能力。
  3. HashMap底层实现原理
    • HashMap底层是基于数组和链表实现的。它有一个初始容量为16的数组,每个数组元素是一个链表的头节点。
    • 当插入一个键值对时,首先会计算键的哈希值,然后通过哈希值与数组长度取模得到数组的索引位置。
    • 如果该位置为空,则直接插入新节点;如果该位置不为空,则遍历链表,若找到相同键的节点,则更新其值,若未找到,则在链表末尾插入新节点。
    • 当链表长度超过8且数组容量小于64时,链表会转换为红黑树,以提高查询效率。
  4. Spring框架依赖注入方式及区别
    • 构造器注入:通过构造函数来注入依赖对象。优点是注入的对象在构造函数执行时就已经完全初始化好,且注入的对象不能为空。缺点是如果依赖对象较多,构造函数参数列表会变得很长。
    • setter注入:通过setter方法来注入依赖对象。优点是代码更加灵活,对象可以先创建后再注入依赖。缺点是注入的对象可能为空,需要额外的判空处理。
    • 接口注入:通过实现特定接口来注入依赖对象,这种方式使用较少。
  5. Spring Boot自动配置原理
    • Spring Boot的自动配置是基于条件注解实现的。它会扫描classpath下的所有META-INF/spring.factories文件。
    • 这些文件中定义了各种自动配置类,Spring Boot会根据项目的依赖情况和当前环境,自动判断哪些自动配置类应该生效。
    • 例如,如果项目中引入了Spring Data JPA的依赖,那么Spring Boot会自动配置JPA相关的组件,如数据源、EntityManager等,通过条件注解来决定是否真正创建这些组件。
  6. MyBatis缓存机制
    • 一级缓存:是SqlSession级别的缓存。在同一个SqlSession中,执行相同的查询语句时,会直接从缓存中获取结果,不会再次查询数据库。当SqlSession关闭时,一级缓存会被清空。
    • 二级缓存:是mapper级别的缓存。多个SqlSession可以共享二级缓存。当一个mapper的查询语句被执行时,会先从二级缓存中查找,如果找不到再查询数据库,并将结果放入二级缓存中。二级缓存需要在MyBatis配置文件中开启,并且要求映射的POJO类必须实现Serializable接口。
  7. Dubbo集群容错策略
    • failover:失败自动切换,当调用失败后会自动重试其他服务器,默认策略。
    • failfast:快速失败,只发起一次调用,失败立即报错,适用于幂等操作。
    • failsafe:失败安全,调用失败不报错,直接忽略,适用于写审计日志等操作。
    • failback:失败自动恢复,调用失败后会在后台异步重试。
    • forking:并行调用多个服务器,只要一个成功就返回,适用于对实时性要求较高的场景。
  8. RabbitMq消息确认机制
    • RabbitMq有两种消息确认模式:
      • 自动确认:消息一旦被消费者接收到,就会自动确认,RabbitMq会立即将消息从队列中删除。这种模式简单但可能会导致消息丢失,如果消费者在处理消息时出现异常,消息已经被确认删除,就无法重新处理。
      • 手动确认:消费者接收到消息后,不会自动确认,需要调用basicAck方法手动确认。可以通过设置multiple参数为true来批量确认消息。这种模式可以确保消息在被正确处理后才被确认删除,避免消息丢失。
  9. xxl-job核心组件及作用
    • 调度中心:负责管理任务调度规则,触发调度执行,并且提供可视化的任务管理界面。
    • 执行器:负责接收调度中心的调度请求并执行任务,可以是单机执行器或集群执行器。
    • 任务管理:用于创建、编辑、删除任务等操作,定义任务的执行逻辑。
    • 日志管理:存储任务执行的日志信息,方便查看任务执行情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值