面试官:第一轮提问开始。首先,说说Java中的多线程创建方式有哪些?
王铁牛:这个简单,有继承Thread类和实现Runnable接口这两种方式。
面试官:不错,回答正确。那再问一个,线程池有哪些核心参数?
王铁牛:线程池的核心参数有corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(线程存活时间)、unit(时间单位)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略)。
面试官:嗯,回答得很全面。最后一个问题,简述一下HashMap的底层实现原理。
王铁牛:HashMap底层是数组+链表+红黑树的结构。当链表长度超过8且数组长度大于64时,链表会转换为红黑树。
面试官:好,第一轮提问结束。接下来进入第二轮。说说JVM的内存结构。
王铁牛:JVM内存结构包括堆、栈、方法区、程序计数器、本地方法栈。
面试官:那类加载机制有哪些?
王铁牛:类加载机制有加载、验证、准备、解析、初始化。
面试官:再问一个,简述Spring的核心特性。
王铁牛:Spring的核心特性有依赖注入、面向切面编程、IoC容器等。
面试官:第二轮提问完毕。现在进入第三轮。说说MyBatis的缓存机制。
王铁牛:MyBatis有一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,二级缓存是mapper级别的缓存。
面试官:那Dubbo的集群容错模式有哪些?
王铁牛:Dubbo的集群容错模式有failover(失败自动切换)、failfast(快速失败)、failsafe(失败安全)、failback(失败自动恢复)、forking(并行调用多个服务)等。
面试官:最后一个问题,简述RabbitMq的工作模式。
王铁牛:RabbitMq的工作模式有简单模式、工作队列模式、发布订阅模式、路由模式、主题模式等。
面试官:好,三轮提问都结束了。回家等通知吧。
答案:
- Java多线程创建方式:
- 继承Thread类:通过继承Thread类并重写run方法来创建线程。
- 实现Runnable接口:实现Runnable接口的run方法,然后将其作为参数传递给Thread类的构造函数来创建线程。
- 线程池核心参数:
- corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
- maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize且任务队列已满时,线程池会创建新线程直到线程数达到maximumPoolSize。
- keepAliveTime:线程存活时间,当线程数大于corePoolSize时,多余的线程在空闲时会存活keepAliveTime这么长时间。
- unit:时间单位,keepAliveTime的时间单位。
- workQueue:任务队列,用于存放提交的任务。
- threadFactory:线程工厂,用于创建线程。
- handler:拒绝策略,当线程数达到maximumPoolSize且任务队列已满时,会调用handler来处理新提交的任务。
- HashMap底层实现原理:
- HashMap底层是数组+链表+红黑树的结构。
- 初始化时,会创建一个长度为2的幂次方的数组。
- 当插入键值对时,会通过键的hash值计算出在数组中的位置。
- 如果该位置为空,则直接插入新节点。
- 如果该位置不为空,则会遍历链表或红黑树,找到相同键的节点则更新其值,否则插入新节点。
- 当链表长度超过8且数组长度大于64时,链表会转换为红黑树,以提高查询效率。
- JVM内存结构:
- 堆:存放对象实例。
- 栈:存放局部变量、操作数栈、动态链接、方法出口等。
- 方法区:存放类信息、常量、静态变量等。
- 程序计数器:记录当前线程执行的字节码指令地址。
- 本地方法栈:为本地方法服务。
- 类加载机制:
- 加载:将类的字节码文件加载到内存中。
- 验证:验证字节码文件的正确性。
- 准备:为类的静态变量分配内存并设置初始值。
- 解析:将符号引用转换为直接引用。
- 初始化:执行类的静态代码块和静态变量的赋值操作。
- Spring核心特性:
- 依赖注入:通过IoC容器将对象的依赖关系注入到对象中。
- 面向切面编程:通过AOP实现横切关注点的模块化。
- IoC容器:管理对象的生命周期和依赖关系。
- MyBatis缓存机制:
- 一级缓存:SqlSession级别的缓存,默认开启。在同一个SqlSession中,对相同数据的查询会从缓存中获取,不会再次查询数据库。
- 二级缓存:mapper级别的缓存,需要手动开启。多个SqlSession可以共享二级缓存。
- Dubbo集群容错模式:
- failover:失败自动切换,当调用失败时,会自动重试其他服务。
- failfast:快速失败,当调用失败时,立即返回错误,不进行重试。
- failsafe:失败安全,当调用失败时,不抛出异常,直接忽略。
- failback:失败自动恢复,当调用失败时,会将任务放入队列中,定时重试。
- forking:并行调用多个服务,只要有一个成功就返回。
- RabbitMq工作模式:
- 简单模式:一个生产者,一个消费者,一条队列。
- 工作队列模式:一个生产者,多个消费者,一条队列,消费者采用轮询的方式获取任务。
- 发布订阅模式:一个生产者,多个消费者,多条队列,生产者将消息发送到交换机,交换机将消息发送到所有绑定的队列。
- 路由模式:一个生产者,多个消费者,多条队列,生产者将消息发送到交换机,交换机根据路由键将消息发送到绑定的队列。
- 主题模式:一个生产者,多个消费者,多条队列,生产者将消息发送到交换机,交换机根据主题将消息发送到绑定的队列。