全网 Java 并发面试题汇总¶
一、线程基础¶
1. 创建线程的方式¶
- 继承
Thread - 实现
Runnable - 实现
Callable+FutureTask(有返回值) - 线程池
ExecutorService
2. 线程状态(6 种)¶
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 个核心参数:
拒绝策略: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 冲突。