博客记录-day117-Java并发,Mybatis,Tomcat面试题+项目面试题

200 阅读9分钟

一、语雀-Java并发面试题

1、如何实现主线程捕获子线程异常

✅如何实现主线程捕获子线程异常

image.png

image.png

1. 为什么不能在try-catch中捕获子线程的异常?

image.png

2、什么是happens-before原则?

✅什么是happens-before原则?

image.png

image.png

image.png

image.png

3、ThreadLocal的应用场景有哪些?

✅ThreadLocal的应用场景有哪些?

image.png

4、ThreadLocal为什么会导致内存泄漏?如何解决的?

✅ThreadLocal为什么会导致内存泄漏?如何解决的?

image.png

image.png

image.png

1. 解决办法

image.png

image.png

image.png

5、AQS的同步队列和条件队列原理?

✅AQS的同步队列和条件队列原理?

1. 同步队列

image.png

image.png

image.png

2. 条件队列

image.png

image.png

image.png

3. 二者区别

image.png

6、什么是AQS的独占模式和共享模式?

✅什么是AQS的独占模式和共享模式?

image.png

image.png

二、语雀-Mybatis面试题

1、Mybatis的优点有哪些?

✅Mybatis的优点有哪些?

image.png

2、DO、DTO、VO都是干什么的?

✅DO、DTO、VO都是干什么的?

image.png

3、Mybatis是如何实现字段映射的?

✅Mybatis是如何实现字段映射的?

image.png

image.png

4、#和$的区别是什么?什么情况必须用后者?

✅#和$的区别是什么?什么情况必须用后者

image.png

5、Mybatis的工作原理?

✅Mybatis的工作原理?

image.png

6、Mybatis的缓存机制

✅Mybatis的缓存机制

1. 一级缓存

image.png

2. 二级缓存

image.png

7、Mybatis用的什么连接池?

✅Mybatis用的什么连接池?

image.png

image.png

三、语雀-Tomcat面试题

1、Tomcat基础

Tomcat 是 ​Apache Software Foundation 开发的开源 Java Web 服务组件,主要用于 ​部署和运行 Java Servlet、JSP(JavaServer Pages)​ 等动态 Web 应用。以下是其核心要点:


1. 核心功能

  • Servlet 容器
    Tomcat 是 Java Servlet 规范的实现,负责接收 HTTP 请求,调用对应的 Servlet 处理逻辑,并返回响应。
  • JSP 支持
    将 JSP 文件动态编译为 Servlet,简化 Java 代码嵌入 HTML 的开发。
  • Web 应用部署
    支持 WAR(Web Application Archive)格式的打包部署,自动解压并运行应用。
  • 内置 HTTP 服务器
    包含 Coyote 协议引擎,可直接处理静态资源(HTML/CSS/JS)和动态请求,无需额外配置 Web 服务器(如 Nginx)。

2. 技术栈集成

  • Java EE(Jakarta EE)兼容
    支持 Servlet 5.x、JSP 2.3 等标准,但需注意 Tomcat 10+ 已迁移至 ​Jakarta EE​(如 jakarta.servlet 包),与旧版 Java EE 不完全兼容。
  • WebSocket 支持
    提供 @ServerEndpoint 注解实现 WebSocket 通信,适用于实时交互场景。
  • 安全机制
    内置 Basic 认证、SSL/TLS 加密、角色权限控制等功能。

3. 典型应用场景

  • 开发与测试
    快速部署原型应用,调试 Servlet 和 JSP 逻辑。
  • 生产环境(中小型项目)​
    轻量级(约 10MB),适合资源有限的服务器,或作为反向代理(如 Nginx + Tomcat)的一部分。
  • 微服务
    结合 Spring Boot 等框架,快速构建 RESTful API 服务。

2、过滤器和拦截器的区别是什么?

✅过滤器和拦截器的区别是什么?

image.png

image.png

3、Tomcat与Web服务器(如Apache)之间的关系是什么?

✅Tomcat与Web服务器(如Apache)之间的关系是什么?

image.png

四、大营销面试题

1、介绍一下大营销的架构

设计:架构图、拓扑图、用例图、流程图、建模图 | 小傅哥 bugstack 虫洞栈

软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。软件架构会包括软件组件、组件之间的关系,组件特性以及组件间关系的特性。软件架构可以和建筑物的架构相比拟。软件架构是构建计算机软件,开发系统以及计划进行的基础,可以列出开发团队需要完成的任务。

该大营销系统采用微服务架构,以高可用性和高性能为核心设计理念,构建了涵盖流量入口、服务治理、数据存储及运维监控的全链路技术生态。前端基于React/Node.js实现多端交互,通过CDN加速与LVS/F5负载均衡集群接收用户请求,结合SSL协议保障传输安全;网关层集成Dubbo RPC框架实现跨服务通信,依托Nacos完成服务注册发现与动态配置管理,并通过DCC动态控制服务熔断、限流、降级机制保障系统稳定性。业务层采用双机房部署模式(4C8G*N规格京东云LVM集群),结合Redis缓存集群、Elasticsearch搜索引擎及MySQL主从同步(通过Canal监听binlog)实现高效数据处理,支持分库分表与读写分离。运维体系集成了Prometheus+Grafana实时监控、Jenkins持续集成、Git版本控制及Jmeter压测工具,配合xxl-job分布式任务调度和RabbitMQ消息队列,形成覆盖部署发布、日志采集、异常预警、性能调优的全方位运维能力,最终通过微信通知与业务监控面板实现闭环管理,整体架构兼具弹性扩展性与技术栈统一性。

2、业务流程图

系统业务功能流程图(Business Functional Flow Diagram,BFD)是一种用于描述和展示系统内业务功能及其之间关系的图形化工具。它通常用于系统分析和设计阶段,以帮助理解和沟通业务流程、功能要求以及系统的各个组件如何协同工作。

  • 在该流程中,详细的展示出了系统的业务流转关系,从1~6的用户行为,全面的展示出了系统中的流程动作。怎么抽奖、怎么返利、怎么兑换积分。
  • 画这个图到时候,首先,需要识别系统中的主要业务功能。这些业务功能通常可以通过业务需求文档、需求分析会谈以及与业务用户的交流中得出。之后,识别各业务功能之间的关系和依赖性。这包括理解哪些业务功能依赖于哪些其他功能,以及它们如何相互作用。最后,绘制流程图,以图形方式展示业务功能和它们之间的关系。

3、工程分层图

工程的分层有 MVC 三层架构、DDD 四层架构,其实 DDD 不能只是说它是架构,因为用于承载 DDD 的架构是;整洁架构、洋葱架构、六边形架构、菱形架构这些。

  • 六边形架构,会把本身提供到外部的放到trigger,让接口调用、消息监听、任务调度,都可以统一一个入口处理。而对于需要调用外部同类的能力统一放到 infrastructure 基础设施层,包括;数据库、缓存、配置、调用其他方的接口。
  • querys 模块是为了提供查询设计的模块,这样一些基本简单的查询就不需要再走到 domain 领域层了。

根据提供的简历内容,以下是对两个项目的难点与亮点的分析:


4、项目难点与亮点

1. 仿掘金营销玩法场景-抽奖策略系统

技术难点:
  1. 高并发场景下的性能优化
    • 抽奖决策需支持高并发请求(如秒杀场景),需将时间复杂度从 O(n) 优化至 O(1),这对算法设计和数据结构选择要求极高。 • 库存扣减需防止超卖,同时保证数据库与缓存的最终一致性,涉及分布式事务和异步处理的设计。

  2. 分布式系统复杂性
    • 基于 DDD 领域驱动设计,需合理划分限界上下文(如抽奖策略、积分、奖品等),并协调多服务间的交互。 • 消息队列(RabbitMQ)的可靠性和补偿机制设计,需处理失败重试、消息幂等性等问题。

  3. 分库分表与路由策略
    • 自研分库分表路由组件(DB-Router)需支持动态路由规则(按用户 ID 等字段分库/分表),并保证数据分布均匀性。 • SQL 改写和动态数据源切换需低侵入式集成到现有框架(如 MyBatis),技术实现复杂度高。

技术亮点:
  1. 创新性技术方案
    O(1) 时间复杂度抽奖算法:通过离散化概率空间和哈希映射表预处理,将抽奖决策效率提升至常数级。 • 责任链模式 + 决策树:实现抽奖前置过滤(黑名单、权重)和后置处理(库存扣减、兜底奖励)的可插拔流程引擎。

  2. 高可用架构设计
    Redis 分段锁 + 异步持久化:采用 Redis DECR 分段消费 + SETNX 锁兜底防止超卖,结合延迟队列异步更新数据库,兼顾性能与数据一致性。 • MQ 解耦与补偿机制:通过 RabbitMQ 监听库存变化解耦发奖流程,定时任务补偿失败任务,确保消息可靠性。

  3. 扩展性与可维护性
    分库分表路由组件:支持按需分库、分表或混合策略,自定义路由注解简化开发流程。 • DDD 分层架构:通过工厂、策略、模板等模式构建易维护的业务体系,提升代码可扩展性。


2. DB-Router 数据库路由组件

技术难点:
  1. 动态数据源管理
    • 基于 AbstractRoutingDataSource 实现动态数据源切换,需解决多线程环境下路由上下文(ThreadLocal)的线程安全问题。

  2. SQL 改写与路由策略
    • 动态解析 SQL 并改写表名(如 user_0user_1),需兼容不同数据库方言(如 MySQL、PostgreSQL)。 • 扰动函数设计:通过哈希散列(如 MurmurHash)实现数据均匀分布,避免分库分表后的热点问题。

  3. 低侵入式集成
    • 基于 AOP 切面拦截自定义注解(如 @DBRouter),需在不修改业务代码的前提下实现路由逻辑。

技术亮点:
  1. 灵活的路由策略
    • 支持自定义路由键(如用户 ID、订单号),可配置分库、分表或混合模式,满足不同业务场景需求。

  2. 高性能与高可用
    • 通过扰动函数优化数据分布,减少分片冲突;支持数据库读写分离和主从切换。

  3. 轻量化与易用性
    • 无侵入式集成到 Spring 生态,提供统一路由组件,降低分库分表实施成本。