贝壳秋招面经(完结)
选中新版正文中的对应文字,然后点“定位到这里”。
同学 1
一面 14:37(34min)
- 自我介绍
- 项目
- ThreadLocal,使用场景,原理
- ArrayList,讲讲其他的List
- ArrayList线程安全版本的容器
- HashMap原理
- ConcurrentHashMap原理
- Spring用了什么设计模式
- bean生命周期
- bean是单例还是多例的,具体怎么修改
- 为什么用b+树不用b树
- 联合索引 (a, b),where a = 1 和 where b = 1,效果是一样的吗
- 事务ACID
- 慢查询怎么分析
- explain分析后, type的执行效率等级,达到什么级别比较合适
- 设计一个秒杀场景
- 消息队列
- 手撕:3个线程交替打印1-100(伪代码就可以)
- 怎么让main线程等待这3个线程执行完再执行
答案
可以使用 synchronized 和 wait/notify 来控制线程交替执行。同时,可以使用 Thread.join() 方法来让 main 线程等待这 3 个线程完成。
class PrintTask implements Runnable {
private static int number = 1; // 共享变量
private int threadId; // 当前线程的编号
private static final Object lock = new Object();
public PrintTask(int threadId) {
this.threadId = threadId;
}
@Override
public void run() {
while (number <= 100) {
synchronized (lock) {
if (number % 3 == threadId) { // 判断是否当前线程的打印轮次
System.out.println("Thread-" + threadId + " prints: " + number++);
lock.notifyAll(); // 唤醒其他等待的线程
} else {
try {
lock.wait(); // 不是当前线程轮次,进入等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
// 主线程
public static void main(String[] args) {
Thread t1 = new Thread(new PrintTask(0)); // Thread-0
Thread t2 = new Thread(new PrintTask(1)); // Thread-1
Thread t3 = new Thread(new PrintTask(2)); // Thread-2
t1.start();
t2.start();
t3.start();
try {
t1.join(); // main ...未能定位到原文的划线
已加入星球,可直接知识星球授权登录
二哥编程星球目前包含:
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复