面试官:第一轮提问开始,首先问你,简述一下Java中的多线程实现方式。
王铁牛:嗯……就是继承Thread类或者实现Runnable接口嘛。
面试官:不错,回答正确。那再问你,线程池的核心参数有哪些?
王铁牛:这个我知道,有corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory和handler。
面试官:很好。最后一个问题,HashMap在多线程环境下会出现什么问题?
王铁牛:会出现死循环,因为扩容的时候会重新计算链表的顺序。
面试官:回答得不错,第一轮通过。
面试官:第二轮提问,说说Spring的核心特性。
王铁牛:这个……好像是IoC和AOP吧。
面试官:不太准确,IoC和AOP是Spring的重要特性,但核心特性还有依赖注入、面向切面编程等。那Spring Boot有什么优势?
王铁牛:能快速搭建项目,自动配置。
面试官:还行。再问你,MyBatis的动态SQL有哪些?
王铁牛:什么是动态SQL来着……好像有if、where之类的。
面试官:第二轮结束,表现一般。
面试官:第三轮提问,Dubbo的集群容错有哪些策略?
王铁牛:这个……不太清楚。
面试官:RabbitMq的工作模式有哪些?
王铁牛:我想想……好像有直连、主题之类的。
面试官:xxl-job的执行器类型有哪些?
王铁牛:完全不知道。
面试官:第三轮结束,整体回答得不是很理想。回家等通知吧。
答案:
- Java中的多线程实现方式:
- 继承Thread类:通过继承Thread类并重写run方法来定义线程的执行逻辑。
- 实现Runnable接口:实现Runnable接口的run方法,然后将其作为参数传递给Thread类的构造函数来创建线程。
- 线程池的核心参数:
- corePoolSize:线程池的核心线程数,当提交的任务数小于corePoolSize时,会创建新线程执行任务。
- maximumPoolSize:线程池的最大线程数,当提交的任务数大于corePoolSize且workQueue已满时,会将任务放入线程池中执行,若线程数达到maximumPoolSize仍有任务,会根据拒绝策略处理。
- keepAliveTime:线程池中的线程在空闲时的存活时间,当线程空闲时间超过keepAliveTime时,会被销毁。
- unit:keepAliveTime的时间单位。
- workQueue:用于存放任务的队列,当提交的任务数大于corePoolSize时,会将任务放入workQueue中。
- threadFactory:用于创建线程的工厂。
- handler:当线程池无法处理新任务时的拒绝策略,如AbortPolicy(抛出异常)、CallerRunsPolicy(调用者运行)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃最旧的任务)。
- HashMap在多线程环境下的问题:
- 在多线程环境下,HashMap在扩容时可能会出现死循环。因为在扩容时,会重新计算链表的顺序,多线程操作可能导致链表形成环形结构,从而导致死循环。
- Spring的核心特性:
- IoC(控制反转):将对象的创建和依赖关系的管理交给Spring容器,而不是在代码中直接创建对象,降低了对象之间的耦合度。
- AOP(面向切面编程):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。可以在不修改原有代码的基础上,对业务逻辑进行增强,比如日志记录、事务管理等。
- 依赖注入:通过IoC容器将依赖对象注入到目标对象中。
- Spring Boot的优势:
- 快速搭建项目:提供了快速创建Spring应用的脚手架,减少了繁琐的配置过程。
- 自动配置:根据项目引入的依赖,自动配置相关的Spring组件,极大地简化了配置工作。
- MyBatis的动态SQL:
- if:根据条件判断动态拼接SQL语句。
- where:自动处理SQL语句中的where子句,避免多余的and。
- set:用于动态更新语句,自动处理更新语句中的set子句,避免多余的逗号。
- foreach:用于循环遍历集合,动态生成SQL语句中的in子句等。
- Dubbo的集群容错策略:
- failover:失败自动切换,当调用失败时,会自动重试其他服务器。
- failfast:快速失败,当调用失败时,立即抛出异常,不再重试。
- failsafe:失败安全,当调用失败时,直接忽略,不抛出异常。
- failback:失败自动恢复,当调用失败时,会在后台定时重试。
- fork:并行调用多个服务器,只要一个成功就返回。
- RabbitMq的工作模式:
- 直连模式:根据消息的routing key将消息路由到与之绑定的队列。
- 主题模式:通过消息的routing key和绑定键(binding key)进行模糊匹配来路由消息到队列。
- xxl-job的执行器类型:
- BEAN模式:执行器为Spring Bean实例。
- COMMAND模式:执行器通过命令行调用外部脚本。
- GLUE模式:可以在线编写任务逻辑代码,支持多种语言。
- SHELL模式:执行器为Shell脚本。