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

33 阅读6分钟

面试官:请简要介绍一下Java中的多线程机制,以及在高并发场景下如何确保线程安全?

王铁牛:多线程就是多个线程同时运行嘛。要确保线程安全,可以用synchronized关键字,给共享资源加锁。

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

王铁牛:核心参数有corePoolSize、maximumPoolSize、keepAliveTime、unit和workQueue。corePoolSize是核心线程数,maximumPoolSize是最大线程数,keepAliveTime是线程池线程空闲时的存活时间,unit是时间单位,workQueue是任务队列。

面试官:嗯,理解得挺到位。再讲讲HashMap的底层数据结构和扩容机制。

王铁牛:HashMap底层是数组加链表,还有红黑树。扩容机制就是当元素个数超过阈值时就会扩容,扩容是原来的两倍。

第一轮结束

面试官:接下来谈谈Spring框架中IoC和AOP的概念,以及它们的应用场景。

王铁牛:IoC就是控制反转,把对象的创建和依赖注入交给Spring容器。AOP是面向切面编程,用于处理横切关注点。应用场景嘛,IoC用在对象管理上,AOP用在日志、事务这些方面。

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

王铁牛:这个……大概就是它能自动帮我们配置好多东西吧,具体咋回事不太清楚。

面试官:MyBatis的缓存机制了解吗?

王铁牛:好像有一级缓存和二级缓存,一级缓存是会话级别的,二级缓存是namespace级别的。

第二轮结束

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

王铁牛:有failover、failfast、failsafe这些吧,不太确定具体的区别。

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

王铁牛:呃,这个不太熟,好像有个什么ack啥的。

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

王铁牛:这个真不知道。

第三轮结束

面试结束后,面试官表示会让王铁牛回家等通知。虽然王铁牛在回答过程中对一些复杂问题回答得不太清晰,但简单问题还是展现出了一定的基础知识。后续是否能通过面试,还需看面试官综合评估其整体表现。

答案:

  • 多线程机制及线程安全:多线程是指多个线程同时运行。在Java中,实现多线程有两种方式,继承Thread类和实现Runnable接口。确保线程安全的关键是处理共享资源的访问。可以使用synchronized关键字来同步代码块或方法,以防止多个线程同时访问共享资源。还可以使用Lock接口及其实现类(如ReentrantLock)来实现更灵活的锁控制。
  • 线程池核心参数及作用
    • corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
    • maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize且任务队列已满时,线程池会创建新线程来执行任务,直到线程数达到maximumPoolSize。
    • keepAliveTime:线程池线程空闲时的存活时间,当线程空闲时间超过keepAliveTime时,线程会被销毁。
    • unit:时间单位,用于指定keepAliveTime的时间单位。
    • workQueue:任务队列,用于存储提交的任务,当线程池的线程都在忙碌时,新提交的任务会被放入任务队列中。
  • HashMap底层数据结构和扩容机制:HashMap底层是由数组和链表组成的数据结构。当链表长度超过一定阈值(默认8)时,链表会转换为红黑树以提高查询效率。扩容机制是当HashMap中的元素个数超过阈值(默认容量的0.75倍)时,HashMap会进行扩容,扩容后的容量是原来的两倍。扩容过程中,会重新计算每个元素在新数组中的位置。
  • Spring框架中IoC和AOP的概念及应用场景
    • IoC(控制反转):把对象的创建和依赖注入交给Spring容器来管理,降低了对象之间的耦合度。应用场景包括对象的创建、依赖注入、生命周期管理等。
    • AOP(面向切面编程):用于处理横切关注点,如日志、事务、安全等。通过将这些横切关注点与业务逻辑分离,提高了代码的可维护性和复用性。
  • Spring Boot自动配置原理:Spring Boot通过@EnableAutoConfiguration注解开启自动配置功能。它会根据项目中引入的依赖,自动配置相关的组件和配置类。自动配置的核心是AutoConfigurationImportSelector,它会根据类路径下的META-INF/spring.factories文件中的配置信息,自动导入相关的配置类。这些配置类会根据项目的实际情况进行自动配置,如配置数据源、事务管理器、WebMvc等。
  • MyBatis缓存机制
    • 一级缓存:是会话级别的缓存,当一个SqlSession执行查询操作时,会先从一级缓存中查找,如果找到则直接返回结果,避免重复查询数据库。一级缓存的生命周期与SqlSession相同,当SqlSession关闭时,一级缓存会被清空。
    • 二级缓存:是namespace级别的缓存,多个SqlSession可以共享二级缓存。当一个SqlSession执行查询操作时,会先从一级缓存中查找,如果找不到则会从二级缓存中查找。二级缓存的生命周期与应用程序相同,只有当应用程序重启时,二级缓存才会被清空。
  • Dubbo集群容错策略
    • failover:失败自动切换,当调用失败时,会自动重试其他服务器,默认重试次数为2次。
    • failfast:快速失败,当调用失败时,立即抛出异常,不再重试。
    • failsafe:失败安全,当调用失败时,直接忽略异常,不抛出。
    • failback:失败自动恢复,当调用失败时,会在后台定时重试。
    • forking:并行调用多个服务器,只要有一个成功就返回。
    • broadcast:广播调用所有服务器,所有服务器都执行调用,返回所有结果。
  • RabbitMq消息确认机制
    • 生产者确认机制:生产者发送消息后,可以通过设置mandatory参数或使用confirm机制来确认消息是否成功到达Broker。
    • 消费者确认机制:消费者接收消息后,可以通过手动确认或自动确认的方式来确认消息是否被成功消费。手动确认需要消费者在处理完消息后调用basicAck方法来确认消息,自动确认则是当消费者接收到消息后,RabbitMq会自动认为消息已被成功消费。
  • xxl-job执行器类型
    • BEAN模式:执行器为Spring Bean实例,通过反射调用方法。
    • COMMAND模式:执行器为外部可执行程序,通过命令行调用。
    • HTTP模式:执行器为HTTP接口,通过HTTP请求调用。
    • TCP模式:执行器为TCP服务端,通过TCP连接调用。