互联网大厂Java面试:核心知识大考验
面试官:请简要介绍一下Java中的多线程,以及如何创建一个线程?
王铁牛:多线程就是在一个程序中同时运行多个线程。创建线程可以通过继承Thread类或者实现Runnable接口。
面试官:不错,回答得很简洁。那线程池有什么作用?如何创建一个线程池?
王铁牛:线程池可以复用线程,提高性能。可以通过ThreadPoolExecutor类来创建线程池。
面试官:很好。再问一个,HashMap在多线程环境下有什么问题?如何解决?
王铁牛:HashMap在多线程环境下可能会出现死循环。可以使用ConcurrentHashMap来替代。
面试官:第一轮面试结束,你的表现还不错。接下来是第二轮面试。请解释一下JVM的内存模型。
王铁牛:JVM内存模型包括堆、栈、方法区等。
面试官:那类加载机制是怎样的?
王铁牛:类加载机制包括加载、验证、准备、解析、初始化。
面试官:Spring框架中的IoC和AOP是什么?
王铁牛:IoC是控制反转,AOP是面向切面编程。
面试官:第二轮面试结束,整体表现还可以。最后一轮面试。说说MyBatis的缓存机制。
王铁牛:MyBatis有一级缓存和二级缓存。
面试官:Dubbo的服务调用原理是什么?
王铁牛:Dubbo通过远程调用实现服务调用。
面试官:RabbitMq的消息队列有哪些模式?
王铁牛:有直连模式、扇形模式等。
面试官:面试结束,回家等通知吧。
答案:
- 多线程:多线程是指在一个程序中同时运行多个线程,每个线程独立执行不同的任务。通过继承Thread类或者实现Runnable接口来创建线程。继承Thread类时,重写run方法;实现Runnable接口时,实现run方法。
- 线程池:线程池可以复用线程,避免频繁创建和销毁线程带来的性能开销。通过ThreadPoolExecutor类创建线程池,可设置核心线程数、最大线程数、队列容量等参数。
- HashMap在多线程问题及解决:HashMap在多线程环境下可能会出现死循环问题,因为其扩容机制在多线程操作时可能导致链表形成环形结构。解决方法是使用线程安全的ConcurrentHashMap,它采用分段锁机制保证线程安全。
- JVM内存模型:JVM内存模型包括堆(存放对象实例)、栈(存放局部变量等)、方法区(存放类信息、常量等)等。堆又分为新生代、老年代等区域。
- 类加载机制:类加载机制包括加载(将类的字节码文件加载到内存)、验证(确保字节码文件合法)、准备(为类的静态变量分配内存并赋初始值)、解析(将符号引用转换为直接引用)、初始化(执行类的静态代码块等)。
- Spring的IoC和AOP:IoC(控制反转)是指将对象的创建和依赖关系的管理交给Spring容器,而不是在代码中直接new对象。AOP(面向切面编程)是指在不修改原有代码的基础上,通过动态代理等方式为目标对象添加额外功能,如日志记录、事务管理等。
- MyBatis缓存机制:MyBatis有一级缓存和二级缓存。一级缓存是SqlSession级别的缓存,在同一个SqlSession中查询相同数据时会直接从缓存中获取。二级缓存是namespace级别的缓存,多个SqlSession可以共享。开启二级缓存后,数据会先从一级缓存中查询,未命中则从二级缓存中查询,更新数据时会同时更新一级缓存和二级缓存。
- Dubbo服务调用原理:Dubbo通过远程调用实现服务调用。服务提供者将服务暴露给注册中心,服务消费者从注册中心获取服务提供者的地址等信息,然后通过网络调用服务提供者的接口。Dubbo采用了集群容错、负载均衡等机制来提高服务调用的可靠性和性能。
- RabbitMq消息队列模式:
- 直连模式:消息只会发送到绑定了指定路由键的队列中。
- 扇形模式:消息会发送到所有绑定到该交换机的队列中。
- 主题模式:通过设置路由键的模式匹配规则,消息会发送到符合规则的队列中。
- 头模式:根据消息的头部信息来进行路由。