1.线程池7大参数
corePoolSize
(核心线程数)、maximumPoolSize
(最大线程数)、keepAliveTime
(空闲线程存活时间)、unit
(时间单位)、workQueue
(任务队列)、threadFactory
(线程工厂)、handler
(拒绝策略)。
2.线程池的执行流程
- 提交任务 → 核心线程未满 → 创建线程执行;
- 核心线程已满 → 任务入队列;
- 队列满 → 创建非核心线程(直到达到最大线程数);
- 线程数达最大且队列满 → 触发拒绝策略。
速记图:核心 → 队列 → 非核心 → 拒绝。
3.拒绝策略有哪些?实际项目用哪个?
AbortPolicy(抛异常)、CallerRunsPolicy(调用者自己执行)、DiscardPolicy(静默丢弃)、DiscardOldestPolicy(丢弃最老任务)。
实战场景 :
一般用CallerRunsPolicy
避免任务丢失,或用自定义策略记录日志后丢弃。
4.ConcurrentHashMap
-
JDK7和JDK8的区别? JDK7用分段锁(Segment),JDK8改用CAS + synchronized锁单个Node,并发度更高。
速记:段锁 → 节点锁。 -
如何保证线程安全? put时用
synchronized
锁链表头节点;读操作无锁(volatile变量保证可见性)。 -
size()方法的实现? JDK8会尝试两次统计,如果两次结果一致直接返回,否则锁住所有段再统计(实际项目几乎不用,推荐用
mappingCount()
)。
5.ReentrantLock vs synchronized
- 两者的区别?
- ReentrantLock可响应中断、支持公平锁、可绑定多个Condition;
- synchronized是JVM层面实现,自动释放锁;
- 性能差异不大(JDK6后synchronized优化过)。
- 什么是公平锁?
公平锁按线程排队顺序获取锁,非公平锁允许插队(默认非公平,性能更高)。
6.CAS和原子类
- CAS原理是什么?缺点?
比较并交换(Compare And Swap),通过CPU指令实现无锁更新。
缺点:ABA问题(用AtomicStampedReference
解决)、自旋消耗CPU。 - AtomicLong和LongAdder的区别? AtomicLong用CAS,高并发时竞争激烈;LongAdder用分段累加,最后合并结果,适合高并发写场景。
7.CountDownLatch和CyclicBarrier
- 两者的区别? CountDownLatch:一次性的,等N个任务完成再触发;CyclicBarrier:可重复用,等N个线程到达屏障后再一起执行。