跳转至

全网 Java 并发面试题汇总

一、线程基础

1. 创建线程的方式

  1. 继承 Thread
  2. 实现 Runnable
  3. 实现 Callable + FutureTask(有返回值)
  4. 线程池 ExecutorService

2. 线程状态(6 种)

NEW -> RUNNABLE -> BLOCKED / WAITING / TIMED_WAITING -> TERMINATED
  • NEW:刚 new,还没 start。
  • RUNNABLE:就绪 + 运行中(OS 层面合并)。
  • BLOCKED:等待 synchronized 锁。
  • WAITING:wait/join,无限期等。
  • TIMED_WAITING:sleep(n)/wait(n)/join(n),限时等。
  • TERMINATED:结束。

二、synchronized

  • 作用于实例方法:锁 this。
  • 作用于静态方法:锁 Class 对象。
  • 作用于代码块:锁括号里的对象。

底层:监视器锁 monitorenter / monitorexit,对象头 Mark Word。JDK 6 后引入偏向锁 → 轻量级锁 → 重量级锁的锁升级过程。

三、volatile

  • 可见性:写后立即刷主存,读时从主存读。
  • 禁止指令重排:插入内存屏障。
  • 不保证原子性i++ 仍然不安全。

典型用途:状态标志、DCL 单例。

四、JUC 核心

1. AQS(AbstractQueuedSynchronizer)

核心是一个 volatile int state + 一个 CLH 等待队列。ReentrantLock、CountDownLatch、Semaphore、ReentrantReadWriteLock 都基于 AQS。

2. Lock 与 synchronized

synchronized ReentrantLock
实现 JVM 关键字 JDK 类
锁释放 自动 必须 finally unlock
可中断 ✅ lockInterruptibly
可超时 ✅ tryLock
公平锁 ✅ 可选
条件变量 一个 wait/notify 多 Condition

3. 并发集合

  • ConcurrentHashMap:JDK8 后 CAS + synchronized 锁桶。
  • CopyOnWriteArrayList:写时复制,读无锁,适合读多写少。
  • BlockingQueue:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue。

4. 线程池(ThreadPoolExecutor)

7 个核心参数:

corePoolSize、maximumPoolSize、keepAliveTime、workQueue、threadFactory、handler

拒绝策略:AbortPolicy(抛异常)、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy。

Executors 的坑

Executors.newFixedThreadPool 用无界队列 LinkedBlockingQueue,可能 OOM;newCachedThreadPool 最大线程数 Integer.MAX_VALUE,可能创建大量线程。生产环境用 new ThreadPoolExecutor(...) 显式创建

5. 工具类

  • CountDownLatch:一等多,不可重置。
  • CyclicBarrier:多等多,可重置。
  • Semaphore:信号量,限流。
  • Exchanger:两线程交换数据。

五、CAS 与 ABA

1. CAS(Compare And Swap)

三个操作数:内存地址 V、预期值 A、新值 B。V == A 时把 V 改为 B,原子执行。

2. ABA 问题

值从 A → B → A,CAS 认为没变过。解决:版本号 AtomicStampedReference

高频追问

  • 什么是伪共享(False Sharing)?用 @Contended 解决。
  • LongAdder 为什么比 AtomicLong 快?分段累加,减少 CAS 冲突。