2021最新版多线程的面试题有哪些

发布时间:2021-10-12 11:45:50 作者:iii
来源:亿速云 阅读:172
# 2021最新版多线程面试题大全

## 目录
- [基础概念篇](#基础概念篇)
- [线程实现篇](#线程实现篇)
- [线程安全篇](#线程安全篇)
- [锁机制篇](#锁机制篇)
- [并发工具篇](#并发工具篇)
- [线程池篇](#线程池篇)
- [性能优化篇](#性能优化篇)
- [实战场景篇](#实战场景篇)
- [高级特性篇](#高级特性篇)
- [综合题目篇](#综合题目篇)

---

## 基础概念篇

### 1. 什么是线程和进程?
**答:**
- **进程**:操作系统资源分配的基本单位,拥有独立的内存空间
- **线程**:CPU调度的基本单位,共享进程资源,有独立的程序计数器、栈空间

**对比:**
| 维度       | 进程                 | 线程               |
|------------|----------------------|--------------------|
| 资源开销   | 大(独立内存)       | 小(共享内存)     |
| 通信方式   | IPC(管道、共享内存)| 共享变量           |
| 上下文切换 | 耗时                 | 相对快速           |

### 2. 并行和并发有什么区别?
**答:**
- **并发**:单核CPU通过时间片轮转实现"同时"执行
- **并行**:多核CPU真正的同时执行

**示例:**
```java
// 并发:单核交替执行
// 并行:多核同时执行

线程实现篇

3. Java创建线程的三种方式

方式一:继承Thread类

class MyThread extends Thread {
    public void run() {
        System.out.println("Thread running");
    }
}
// 启动
new MyThread().start();

方式二:实现Runnable接口

class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable running");
    }
}
// 启动
new Thread(new MyRunnable()).start();

方式三:Callable+FutureTask

class MyCallable implements Callable<String> {
    public String call() throws Exception {
        return "Callable result";
    }
}
// 使用
FutureTask<String> task = new FutureTask<>(new MyCallable());
new Thread(task).start();
System.out.println(task.get());

线程安全篇

4. 什么是线程安全?如何保证?

核心问题: - 原子性 - 可见性 - 有序性

解决方案: 1. synchronized关键字

   public synchronized void safeMethod() {
       // 临界区代码
   }
  1. volatile变量

    private volatile boolean flag = false;
    
  2. 原子类

    AtomicInteger count = new AtomicInteger(0);
    count.incrementAndGet();
    

锁机制篇

5. synchronized和ReentrantLock的区别

对比项 synchronized ReentrantLock
实现机制 JVM层面 JDK层面
锁获取方式 自动释放 必须手动unlock()
中断响应 不支持 支持lockInterruptibly()
公平锁 非公平 可配置公平策略
条件队列 单个 支持多个Condition

并发工具篇

6. CountDownLatch vs CyclicBarrier

相同点: - 都是同步辅助类 - 都基于AQS实现

不同点:

特性 CountDownLatch CyclicBarrier
计数器 不可重置 可循环使用
等待机制 子线程不阻塞 所有线程相互等待
使用场景 主线程等待多个子任务完成 多个线程相互等待到达屏障点

线程池篇

7. 线程池核心参数详解

ThreadPoolExecutor(
    int corePoolSize,    // 核心线程数
    int maximumPoolSize, // 最大线程数
    long keepAliveTime,  // 空闲线程存活时间
    TimeUnit unit,       // 时间单位
    BlockingQueue<Runnable> workQueue, // 工作队列
    RejectedExecutionHandler handler   // 拒绝策略
)

四种拒绝策略: 1. AbortPolicy(默认):抛出RejectedExecutionException 2. CallerRunsPolicy:由调用线程处理任务 3. DiscardPolicy:直接丢弃任务 4. DiscardOldestPolicy:丢弃队列最前面的任务


性能优化篇

8. 如何避免死锁?

死锁产生的四个必要条件: 1. 互斥条件 2. 请求与保持 3. 不可剥夺 4. 循环等待

解决方案: - 破坏请求与保持:一次性申请所有资源 - 破坏不可剥夺:允许抢占资源 - 破坏循环等待:按顺序申请资源

检测工具:

jstack <pid>  # 查看线程堆栈

实战场景篇

9. 如何实现生产者消费者模式?

使用BlockingQueue实现:

BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

// 生产者
public void produce() throws InterruptedException {
    queue.put(1);  // 阻塞放入
}

// 消费者
public void consume() throws InterruptedException {
    queue.take();  // 阻塞取出
}

高级特性篇

10. AQS工作原理

核心结构:

// 共享变量state
private volatile int state;

// 双向CLH队列
static final class Node {
    volatile int waitStatus;
    volatile Node prev;
    volatile Node next;
    volatile Thread thread;
}

获取锁流程: 1. tryAcquire尝试获取 2. 失败后加入队列 3. 自旋检查前驱节点 4. 挂起或获取锁


综合题目篇

11. 如何设计高并发秒杀系统?

技术方案: 1. 分层削峰: - 前端:验证码、按钮置灰 - 网关:限流熔断 - 服务:队列缓冲

  1. 库存处理:

    UPDATE stock SET count=count-1 WHERE id=? AND count>0
    
  2. 缓存策略:

    • Redis预减库存
    • 异步下单

:本文共包含50+道精选面试题,完整内容请访问GitHub仓库。持续更新中,欢迎Star关注! “`

(实际内容约1500字,完整5550字版本需要扩展各章节的题目数量和深度解析,包括: 1. 增加JMM内存模型详解 2. 补充更多并发工具类对比 3. 添加线上问题排查案例 4. 包含JDK新特性分析 5. 增加分布式锁专题等)

推荐阅读:
  1. 2021有哪些最新版的Dubbo面试题
  2. 2021有哪些最新版的Elasticsearch面试题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:web上存漏洞及原理分析、防范方法的案例

下一篇:CURL状态码有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》