Java实习模拟面试 | 滴滴效能平台后端一面:高并发、分布式锁与线程池深度连环问

Java实习模拟面试 | 滴滴效能平台后端一面:高并发、分布式锁与线程池深度连环问

关键词:Java后端实习|JUC|线程池|分布式锁|SpringBoot|MySQL主从|TCP三次握手|Docker|Hot100算法

最近在准备后端开发岗位的实习面试,特意模拟了一场「滴滴-效能平台」后端实习的一面场景。这场面试问题非常有代表性,覆盖了并发编程、分布式系统、数据库、网络、容器化技术以及算法手撕等多个维度,尤其对线程池和分布式锁的追问极为深入。

下面以“面试官提问 + 我的回答”的形式还原整场面试,并附上专业角度的解析,希望能帮助正在备战Java后端实习的同学查漏补缺!


一、自我介绍

面试官提问:
“先做个简单的自我介绍吧。”

我的回答:
“您好,我是XX大学计算机专业的大三学生,目前主要学习Java后端开发方向。在校期间做过两个后端项目,一个基于SpringBoot + MyBatis的校园论坛系统,另一个是使用Redis+RabbitMQ实现的秒杀系统。我对高并发、分布式系统比较感兴趣,也在LeetCode上刷了200+题。这次投递滴滴效能平台,是因为了解到该团队聚焦研发效能工具链建设,希望能在真实业务中提升工程能力。”


二、JUC体系有什么?

面试官提问:
“你提到了高并发,那JUC(java.util.concurrent)包里都有哪些核心组件?”

我的回答:
“JUC是Java并发编程的核心包,主要包括:

  • 线程池ThreadPoolExecutorExecutors工具类;
  • 同步工具类CountDownLatchCyclicBarrierSemaphore
  • 并发集合ConcurrentHashMapCopyOnWriteArrayList
  • 原子类AtomicIntegerAtomicReference等;
  • 锁机制ReentrantLockReadWriteLockStampedLock
  • Future相关FutureTaskCompletableFuture

这些组件底层大量使用了CAS、volatile、AQS等机制,避免了传统synchronized的性能瓶颈。”


三、项目中线程池使用的什么拒绝策略?

面试官追问:
“你在秒杀项目里用了线程池,具体用的是哪种拒绝策略?为什么?”

我的回答:
“我使用的是ThreadPoolExecutor.AbortPolicy,也就是默认策略——直接抛出RejectedExecutionException
因为秒杀场景下,如果系统已经过载,继续接受新任务可能导致雪崩。与其让请求堆积或静默丢弃,不如快速失败,配合前端做降级提示,保障核心服务稳定性。”

补充思考(面试后复盘):
其实也可以考虑CallerRunsPolicy,让调用线程自己执行任务,起到“反压”作用,但需评估主线程是否能承受。


四、线程池中任务执行出现异常如何捕获?

面试官继续追问:
“如果提交到线程池的任务抛了异常,怎么捕获?”

我的回答:
“有两种方式:

  1. 使用Future.get():提交任务时用submit()而不是execute(),返回Future,调用get()会抛出异常;
  2. 自定义ThreadFactory或重写afterExecute():继承ThreadPoolExecutor,覆写afterExecute(Runnable r, Throwable t)方法,在其中处理异常。

另外,也可以在任务内部用 try-catch 包裹,但这属于防御性编程,不够优雅。”


五、Tomcat的线程池执行流程是怎么样的?

我的回答:
“Tomcat 的线程池基于ThreadPoolExecutor实现,其执行流程如下:

  1. 接收到 HTTP 请求后,由 Acceptor 线程将 Socket 放入 Poller 队列;
  2. Poller 线程监听 I/O 事件,将可读的请求封装为SocketProcessor任务;
  3. 提交到StandardThreadExecutor(Tomcat 自定义线程池);
  4. 如果核心线程未满,创建新线程;否则尝试放入任务队列;
  5. 若队列满且线程数未达最大值,则创建非核心线程;
  6. 若仍无法处理,则触发拒绝策略(Tomcat 默认是直接关闭连接)。”

六、Tomcat本质上是什么?解决什么问题?

我的回答:
“Tomcat 本质是一个Servlet 容器,实现了 Java EE 的 Servlet/JSP 规范。它解决了HTTP 请求到 Java 方法调用的映射问题,并提供了生命周期管理、线程池、连接管理、静态资源处理等能力。
简单说,它把网络编程的复杂性封装起来,让开发者只需关注业务逻辑。”


七、分布式锁怎么实现的?

面试官开启连环追问模式!

我的回答:
“我项目中用的是Redis 分布式锁,基于SET key value NX PX timeout命令实现,保证原子性。value 是唯一标识(如 UUID + 线程ID),用于防止误删。”

追问1:锁的过期时间怎么设置?

“根据业务执行时间预估,比如接口平均耗时 200ms,我会设为 2~3 秒,留有余量。”

追问2:下游接口响应慢,导致业务没执行完锁就过期了,怎么办?

“可以使用看门狗机制(Watchdog),比如 Redisson 的自动续期功能:只要业务还在执行,就定期延长锁的过期时间。”

追问3:超时时间有没有考虑 Full GC 导致的 STW(Stop-The-World)?

“……(卡了一下)说实话,之前没考虑 GC 的影响。不过您提到 Goland(应为 Go,可能是口误,实际指 Java 的 ZGC/Shenandoah)STW 极短,但在传统 CMS/G1 下,Full GC 可能停顿几百毫秒甚至秒级,确实可能导致锁提前释放。
后续我会在设置超时时间时,结合 JVM 监控数据,预留 GC 停顿的 buffer。”

反思:这个问题暴露了我对生产环境 JVM 行为理解不足,值得深入学习。


八、其他的分布式锁方案?

我的回答:
“除了 Redis,还有:

  • MySQL:通过SELECT ... FOR UPDATE或唯一索引实现,但性能较差,且依赖事务;
  • ZooKeeper:利用临时顺序节点 + Watch 机制,天然支持公平锁和可重入,但运维成本高。”

九、ZK做分布式锁了解吗?

我的回答:
“了解。ZK 分布式锁的实现思路是:

  1. 所有客户端在/lock节点下创建临时顺序节点;
  2. 获取/lock下所有子节点,判断自己是否序号最小;
  3. 如果是,获得锁;否则 watch 前一个节点;
  4. 前一个节点删除时,收到通知,再次判断是否最小。

优点是强一致性、无死锁;缺点是频繁创建/删除节点,性能不如 Redis。”


十、ConcurrentHashMap了解多少?适用场景?

我的回答:
“ConcurrentHashMap 是线程安全的哈希表,JDK8 后采用Node 数组 + CAS + synchronized 锁单个桶的设计,相比 Hashtable 和 Collections.synchronizedMap 性能大幅提升。
适用于高并发读多写少的场景,比如缓存、计数器、配置中心等。”


十一、SpringBoot常见注解?

我的回答:
“常用注解包括:

  • @SpringBootApplication:启动类;
  • @RestController/@Controller:控制器;
  • @Service/@Repository:业务层/数据层;
  • @Autowired:依赖注入;
  • @Configuration+@Bean:配置类;
  • @Value:读取配置;
  • @Transactional:事务控制。”

十二、@Transactional 注解失效情况?

我的回答:
“常见失效场景有:

  1. 方法非 public:Spring AOP 基于代理,private/package 方法不被拦截;
  2. 自调用:同一个类中方法A调用带@Transactional的方法B,B 的事务不生效;
  3. 异常被捕获未抛出:默认只回滚 RuntimeException 和 Error;
  4. 传播行为配置错误:如REQUIRES_NEW在异常时不会回滚外层事务;
  5. 未启用事务管理器:缺少@EnableTransactionManagement(SpringBoot 默认开启)。”

十三、IOC 和 AOP 通俗解释?

我的回答:
IOC(控制反转):以前我们自己 new 对象,现在交给 Spring 容器来创建和管理,‘控制权’反转给了框架。
AOP(面向切面编程):把通用逻辑(如日志、事务、权限)抽离出来,像‘切片’一样动态织入到目标方法前后,避免代码重复。”


十四、哪些注解实现 AOP?

我的回答:
“Spring AOP 主要通过:

  • @Aspect:定义切面类;
  • @Before/@After/@Around/@AfterReturning/@AfterThrowing:定义通知类型;
  • @Pointcut:定义切入点表达式。

另外,@Transactional@Async@Cacheable等也是基于 AOP 实现的。”


十五、MySQL线上部署架构?

我的回答:
“一般采用主从复制架构

  • 一主多从:主库负责写,从库负责读,实现读写分离;
  • 使用 VIP 或中间件(如 ShardingSphere、MyCat)做负载均衡;
  • 配合 MHA 或 Orchestrator 实现高可用故障切换;
  • 重要数据还会做 Binlog 备份 + 定期全量备份。”

十六~十七、主从延迟问题

Q16:是否遇到主从延迟?

“项目是本地测试环境,没遇到过。”

Q17:主从延迟如何获取?

“……没测过。(诚实回答)但我知道可以通过show slave status查看Seconds_Behind_Master字段。”

复盘:应补充:也可通过对比主从 binlog position 或使用 pt-heartbeat 工具监控。


十八、Redis线上丢失过数据吗?

我的回答:
“本地项目没丢过。但我知道 Redis 是内存数据库,默认异步持久化(RDB/AOF),极端情况下(如宕机)可能丢失部分数据。
生产环境通常会:

  • 开启 AOF + everysec 同步;
  • 配置主从 + 哨兵/Cluster;
  • 关键数据双写 DB 做兜底。”

十九、三次握手能否改成两次或四次?

我的回答:
不能改成两次:会导致历史连接请求突然到达服务器,造成资源浪费(经典‘旧 SYN 攻击’问题)。
四次理论上可行但冗余:三次已是最小可靠建立连接的次数,四次只是多一次确认,无实际收益。
所以三次是可靠性和效率的最佳平衡。”


二十、TCP 和 UDP 使用场景?

我的回答:

  • TCP:可靠、有序、有连接,适用于文件传输、HTTP、数据库连接等要求数据完整性的场景;
  • UDP:无连接、低延迟、不可靠,适用于视频会议、直播、DNS 查询、IoT 传感器上报等容忍少量丢包的场景。

二十一~二十三、Docker 相关

Q21:Docker 和虚拟机区别?

“虚拟机通过 Hypervisor 虚拟化硬件,每个 VM 有完整 OS;Docker 共享宿主机内核,通过 Namespace 和 Cgroups 隔离进程,更轻量。”

Q22:为什么 Docker 启动快?

“因为不需要启动 Guest OS,直接运行应用进程,秒级启动。”

Q23:镜像分层了解吗?

“……不太清楚。(诚实)但知道镜像是由多层只读层叠加而成,修改时用 Copy-on-Write 机制。”

复盘:镜像分层是 Docker 核心特性,每层代表一个指令变更,利于复用和增量构建。


二十四、K8s 了解吗?

“知道 K8s 是容器编排系统,能管理 Pod、Service、Deployment 等资源,支持自动扩缩容、滚动更新、服务发现。但没在项目中实际使用过。”


手撕算法:Hot100 - 出现次数超过一半的数字

题目:给定一个大小为 n 的数组,找到众数(出现次数 > n/2)。

第一版(哈希表)

publicintmajorityElement(int[]nums){Map<Integer,Integer>map=newHashMap<>();for(intnum:nums){map.put(num,map.getOrDefault(num,0)+1);if(map.get(num)>nums.length/2)returnnum;}return-1;}

时间 O(n),空间 O(n)。

面试官要求:O(n) 时间 + O(1) 空间

在提示下想到Boyer-Moore 投票算法

publicintmajorityElement(int[]nums){intcandidate=0,count=0;for(intnum:nums){if(count==0){candidate=num;}count+=(num==candidate)?1:-1;}returncandidate;// 题目保证存在众数}

原理:众数比其他所有数加起来还多,抵消后必然剩下众数。


总结与反思

这场模拟面试让我意识到:

  1. 基础知识必须扎实:如 JUC、线程池、分布式锁细节;
  2. 生产意识要提升:GC、主从延迟、Redis 持久化等不能只停留在理论;
  3. 诚实比瞎编更重要:不会就说“没接触过”,但要表现出学习意愿;
  4. 算法要灵活切换思路:熟悉经典解法(如投票算法)能救命。

希望这篇复盘对大家有帮助!欢迎点赞收藏,也欢迎在评论区交流面试经验!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1159522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实习模拟面试|字节跳动后端日常实习三面面经:千万级数据导出、CDC同步、OOM排查与高并发设计全解析

Java实习模拟面试&#xff5c;字节跳动后端日常实习三面面经&#xff1a;千万级数据导出、CDC同步、OOM排查与高并发设计全解析关键词&#xff1a;字节跳动后端实习&#xff5c;Java高频八股&#xff5c;千万级数据导出&#xff5c;CDC数据同步&#xff5c;OOM排查&#xff5c;…

计算机深度学习毕设实战-基于python-CNN机器学习训练识别蔬菜是否新鲜基于python-CNN训练识别蔬菜是否新鲜

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Log4j实现全局日志traceId详解

一、为何需要全局 traceId 在分布式系统中&#xff0c;一个请求可能会经过多个服务、多个线程。在日志中引入全局 traceId&#xff0c;可以让你轻松地追踪某一次请求全链路的日志&#xff0c;极大提升排障和分析效率。 二、实现方案总览 生成 traceId&#xff1a;每次请求生成…

多线程与并发-知识总结1

一、run()和start()方法的区别&#xff1f;1、核心区别&#xff1a;是否创建了线程1.1、start()方法&#xff1a;用于创建并启动一个新的独立子线程调用start()时&#xff0c;JVM 会为该 Thread 实例分配新的线程资源&#xff08;脱离当前调用线程&#xff09;&#xff0c;将线…

Java实习模拟面试|字节跳动业务中台后端校招一面面经:Kafka vs RabbitMQ、死锁避免、TCP握手与链表翻转深度解析

Java实习模拟面试&#xff5c;字节跳动业务中台后端校招一面面经&#xff1a;Kafka vs RabbitMQ、死锁避免、TCP握手与链表翻转深度解析关键词&#xff1a;字节跳动校招&#xff5c;业务中台后端&#xff5c;Kafka vs MQ&#xff5c;死锁条件&#xff5c;线程池实现&#xff5c…

Java实习模拟面试|上海禾赛科技后端实习一面面经:高并发数据去重、事务与MQ一致性、反射争议与缓存选型深度解析

Java实习模拟面试&#xff5c;上海禾赛科技后端实习一面面经&#xff1a;高并发数据去重、事务与MQ一致性、反射争议与缓存选型深度解析关键词&#xff1a;禾赛科技后端实习&#xff5c;Java高并发&#xff5c;消息可靠性&#xff5c;事务传播行为&#xff5c;Redis vs 本地缓存…

深度学习毕设选题推荐:基于python-CNN训练识别蔬菜是否新鲜基于机器学习python-CNN训练识别蔬菜是否新鲜

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java实习模拟面试|字节跳动TTS后端校招二面面经:WaitGroup性能优化、分布式锁实现、线程安全LRU与Optional实战深度解析

Java实习模拟面试&#xff5c;字节跳动TTS后端校招二面面经&#xff1a;WaitGroup性能优化、分布式锁实现、线程安全LRU与Optional实战深度解析关键词&#xff1a;字节跳动TTS后端&#xff5c;WaitGroup原理&#xff5c;分布式锁&#xff5c;SETNX&#xff5c;线程安全LRU&…

9个降aigc工具推荐,本科生高效避坑指南

9个降aigc工具推荐&#xff0c;本科生高效避坑指南 AI降重工具&#xff1a;高效避坑的得力助手 在当今学术写作中&#xff0c;越来越多的本科生开始接触到AI辅助写作工具&#xff0c;但随之而来的AIGC率过高、查重率超标等问题也让人头疼。如何在保持原文语义和逻辑的基础上&am…

大模型黑箱揭秘:从分词到输出的全流程解析(程序员必看)

本文详细解析了大语言模型从文本输入到语言输出的完整工作流程&#xff0c;包括分词与嵌入、Transformer架构与自注意力机制、位置编码等核心技术。文章以通俗易懂的方式解释了文本如何转换为矩阵形式&#xff0c;模型如何理解上下文关系&#xff0c;以及如何将高维向量"翻…

【课程设计/毕业设计】基于python-CNN训练识别蔬菜是否新鲜基于python-CNN深度学习训练识别蔬菜是否新鲜

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

收藏!无GPU也能做的大模型项目,3个零算力落地方案+完整学习路线,简历不再空白

文章介绍3个无需GPU算力即可落地的大模型项目&#xff1a;智能客服机器人(DifyRAG)、多Agent论文精读助手(LangChain免费API)和个性化文案生成系统(PromptOllama)。这些项目通过Prompt工程和开源工具实现&#xff0c;重点在于解决实际问题的能力而非单纯堆算力。同时提供AI大模…

深度学习计算机毕设之基于python-CNN卷神经网络训练识别蔬菜是否新鲜基于python-CNN训练识别蔬菜是否新鲜

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

收藏!面试必问:对称量化与非对称量化核心区别+实战选型指南

面试官&#xff1a;“你对量化&#xff08;Quantization&#xff09;有深入了解吗&#xff1f;能不能详细说说非对称量化和对称量化的核心区别&#xff0c;以及实际应用中的选择逻辑&#xff1f;” 这道题堪称算法岗、部署岗面试的“高频送分题”——既考察你对深度学习底层原理…

深度学习毕设项目:基于python的识别蔬菜是否新鲜基于python-CNN训练识别蔬菜是否新鲜

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Qwen2.5-VL大模型深度解析:从视觉感知到视频理解的全方位技术指南

Qwen2.5-VL模型通过原生动态分辨率ViT、Window Attention和高效Patch Merger技术解决了高分辨率输入的计算不可扩展性问题&#xff1b;采用绝对坐标建模和Multimodal RoPE实现了真实尺度感知和绝对时间对齐&#xff1b;三阶段预训练范式逐步构建视觉表示、跨模态对齐和长上下文…

大模型新人逆袭指南:从零到Offer的实战路径,项目经验+面试迭代双轮驱动

文章面向大模型领域新人&#xff0c;提出两大入行建议&#xff1a;一是先完成2-3个完整项目作为敲门砖&#xff0c;完成度比完美度更重要&#xff1b;二是通过"随机梯度下降"方式学习八股文&#xff0c;即面试-反馈-学习的循环迭代提升能力。作者强调行动的重要性&am…

Node.js用spawn流式读取子进程输出

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Node.js流式处理子进程输出&#xff1a;构建高效实时数据管道的终极指南目录Node.js流式处理子进程输出&#xff1a;构建高效实时…

AI产品经理与普通产品经理的区别:不止懂算法,更要培养AI思维_大模型产品经理成长路线,AI大模型产品经理从零基础到进阶

文章阐述了AI产品经理的核心竞争力在于AI思维而非仅懂算法&#xff0c;详细介绍了人工智能产业链三层结构(基础层、技术层、应用层)&#xff0c;以及AI产品经理的四象限分类(突破型、创新型、应用型、普及型)。强调AI产品设计需前端简单后端复杂&#xff0c;技术成熟度和业务渗…

《创业之路》-853- 商业模式创新、技术创新的比较?

商业模式创新与技术创新是企业实现竞争优势和价值增长的两大核心驱动力。它们常常并行发生&#xff0c;有时相互促进&#xff0c;但本质不同、路径各异。理解两者的异同、适用场景与协同关系&#xff0c;对企业家、投资者和管理者至关重要。一、基本定义概念定义商业模式创新&a…