并发编程知识纲领

并发编程知识纲领

_

针对Java面试中的并发编程部分,这里为您梳理一个高效、有侧重点的复习纲领。本纲领遵循 “基础 → 核心 → 高级 → 实战” 的递进逻辑,并突出面试高频考点。

第一阶段:夯实基础 —— 理解核心概念与线程本身

目标:能清晰阐述线程、并发的基本概念和生命周期。

  • 核心1:线程的创建与运行

    • 两种创建方式:继承 Thread类 vs 实现 Runnable/ Callable接口。必须能说明为何推荐后者(避免单继承限制,任务与线程分离)。

    • 核心方法:start()vs run()的区别,sleep()yield()join()的含义与使用。

  • 核心2:线程状态与生命周期

    • 熟练掌握Java定义的6种线程状态:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。能画出状态转换图,并说明每种转换发生的条件(如 wait()进入WAITING,synchronized竞争失败进入BLOCKED)。

  • 核心3:守护线程

    • 理解守护线程(Daemon)与用户线程的区别,以及JVM退出的规则。

第二阶段:攻克核心 —— 共享、通信与同步

目标:掌握如何安全地实现线程间数据共享、通信和同步,这是面试的绝对重心。

  • 核心1:Java内存模型与三大问题

    • JMM:理解主内存与工作内存的概念,知道它是规范,不是真实存在。

    • 三大并发问题根源:能结合JMM解释原子性、可见性、有序性。这是理解所有同步工具的基础。

  • 核心2:两大同步原语

    • synchronized关键字

      • 用法:同步实例方法、静态方法、代码块。

      • 锁对象(monitor)是谁?必须能说清楚

      • 锁升级过程(JDK1.6+):无锁 → 偏向锁 → 轻量级锁(自旋) → 重量级锁。了解为什么优化,以及各阶段适用场景。

    • volatile关键字

      • 两大语义:保证可见性、禁止指令重排序

      • 底层实现:内存屏障。

      • 必须明确它不保证原子性(经典反例:i++)。

      • 典型应用场景:状态标志位、DCL单例模式。

  • 核心3:线程间通信

    • 等待/通知机制Object.wait()Object.notify()/notifyAll()必须理解调用前提(持有锁)、等待条件应放在while循环中检查

  • 核心4:Java并发工具类(JUC)

    • 这是面试考察你知识深度的关键区,分为以下几类:

        • Lock接口 与 ReentrantLock:理解与 synchronized的对比(可中断、可尝试、公平锁等)。

        • 读写锁 ReentrantReadWriteLock:读写分离,提高并发度。

      1. 同步器

        • CountDownLatch“倒数闩”,一等多。用于任务分批。

        • CyclicBarrier“循环栅栏”,多等一。用于任务并行计算后汇总。

        • Semaphore“信号量”,控制并发访问的线程数。

        • 必须能清晰说出这三者的区别和典型应用场景

      2. 线程安全集合

        • ConcurrentHashMap高频考点。必须掌握其演进(分段锁 → CAS + synchronized),理解高并发下的实现原理。

        • CopyOnWriteArrayList:读写分离,适用读多写极少场景。知道其写时复制的开销。

      3. 原子类

        • AtomicInteger等。理解其核心是 CAS (Compare-And-Swap) 操作

        • 能解释 CAS 的原理、优点(无锁高性能)和缺点(ABA问题、自旋开销)。知道ABA问题及解决方案(AtomicStampedReference)。

第三阶段:掌握框架 —— 线程池与异步

目标:理解并熟练运用线程资源的管理框架。

  • 核心1:线程池(ThreadPoolExecutor)

    • 高频考点必须能手写其7大核心参数的构造方法,并解释每个参数的含义

      new ThreadPoolExecutor(int corePoolSize,
                            int maximumPoolSize,
                            long keepAliveTime,
                            TimeUnit unit,
                            BlockingQueue<Runnable> workQueue,
                            ThreadFactory threadFactory,
                            RejectedExecutionHandler handler)
      
    • 任务提交与执行流程:能用流程图描述“核心池 → 队列 → 最大池 → 拒绝策略”这个过程。

    • 四种常见拒绝策略及其使用场景。

    • 实际中更常用 Executors工具类创建的线程池(如 newCachedThreadPool, newFixedThreadPool),但必须清楚它们潜在的问题(如 newFixedThreadPool使用无界队列可能导致OOM)。

  • 核心2:Future 与 Callable

    • 理解如何获取异步任务结果。知道 Future.get()的局限性(阻塞)。

  • 核心3:CompletableFuture (JDK8+)

    • 掌握其核心思想:异步回调、组合式异步编程。能使用 supplyAsyncthenApplythenAcceptthenComposethenCombineallOf/anyOf等常用方法。这是展示你现代Java并发能力的关键。

第四阶段:进阶与综合

目标:应对高阶问题,形成知识体系。

  • 核心1:锁的深入

    • 可重入锁概念。

    • 公平锁 vs 非公平锁。

    • 乐观锁与悲观锁的概念及典型实现(synchronized是悲观锁,CAS是乐观锁思想)。

  • 核心2:ThreadLocal

    • 原理:每个线程有独立的 ThreadLocalMap。能画出结构图。

    • 经典应用场景:数据库连接、Session管理。

    • 必须知道其内存泄露风险及如何避免(使用 remove())。

  • 核心3:并发设计模式与问题

    • 生产者-消费者模式:能用 BlockingQueue优雅实现。

    • 死锁:能写出一个死锁代码示例,并说明产生的四个必要条件。知道如何排查(jstack)和预防(顺序加锁、尝试获取锁等)。

面试实战建议

  1. 表述结构化:回答时采用“定义 → 原理/机制 → 优缺点 → 应用场景 → 相关对比”的逻辑。

  2. 结合场景:当被问到“如何保证线程安全”时,不要只背工具,要分析场景(读多写少?性能要求?),再给出方案(用 volatile还是 synchronized,或是 ReentrantLockConcurrentHashMap)。

  3. 准备项目经验:准备1-2个你在实际项目中使用或排查过并发问题的例子(如:用线程池优化批量任务、用 CountDownLatch协调多服务调用、排查过死锁或线程池配置不当问题)。这是极大的加分项。

  4. 高频问题自查

    • synchronized 和 ReentrantLock 的区别?

    • volatile 关键字的作用?它能保证原子性吗?

    • 线程池的核心参数和工作流程?

    • ConcurrentHashMap 如何保证线程安全?(JDK1.7和1.8的区别)

    • 什么是CAS?有什么问题?

    • 对ABA问题的理解?

    • 什么是ThreadLocal?会内存泄露吗?

按照这个纲领,从第一阶段到第四阶段逐步深入,将知识点串联成网,并结合具体代码和场景理解,你就能在Java并发面试中表现出扎实的基础和清晰的思路。

MySQL索引 2026-03-07
使用磁盘作为虚拟内存(Swap分区) 2026-03-18

评论区