并发

1.线程池7大参数

corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、keepAliveTime(空闲线程存活时间)、unit(时间单位)、workQueue(任务队列)、threadFactory(线程工厂)、handler(拒绝策略)。

2.线程池的执行流程

  1. 提交任务 → 核心线程未满 → 创建线程执行;
  2. 核心线程已满 → 任务入队列;
  3. 队列满 → 创建非核心线程(直到达到最大线程数);
  4. 线程数达最大且队列满 → 触发拒绝策略。
    速记图:核心 → 队列 → 非核心 → 拒绝。

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

  • 两者的区别?
  1. ReentrantLock可响应中断、支持公平锁、可绑定多个Condition;
  2. synchronized是JVM层面实现,自动释放锁;
  3. 性能差异不大(JDK6后synchronized优化过)。
  • 什么是公平锁?
    公平锁按线程排队顺序获取锁,非公平锁允许插队(默认非公平,性能更高)。

6.CAS和原子类

  • CAS原理是什么?缺点?
    比较并交换(Compare And Swap),通过CPU指令实现无锁更新。
    缺点:ABA问题(用AtomicStampedReference解决)、自旋消耗CPU。
  • AtomicLong和LongAdder的区别? AtomicLong用CAS,高并发时竞争激烈;LongAdder用分段累加,最后合并结果,适合高并发写场景。

7.CountDownLatch和CyclicBarrier

  • 两者的区别? CountDownLatch:一次性的,等N个任务完成再触发;CyclicBarrier:可重复用,等N个线程到达屏障后再一起执行。
相关推荐
han_15 小时前
前端高频面试题之CSS篇(一)
前端·css·面试
덕화15 小时前
【面试宝典】线上问题逆向分析1
面试·职场和发展
美团程序员15 小时前
一篇文章教你搞定:”xx 功能如何测试?“常见面试题型!
测试工具·面试·职场和发展·测试用例
谷隐凡二18 小时前
Server-Client二层架构简单说明
面试
豆奶特浓619 小时前
Java面试模拟:当搞笑程序员谢飞机遇到电商秒杀与AIGC客服场景
java·spring boot·微服务·面试·aigc·高并发·电商
拉不动的猪20 小时前
Axios 请求取消机制详解
前端·javascript·面试
铭哥的编程日记20 小时前
《斩获字节跳动offer 最详细的面试真题与破解思路》第一期
面试·职场和发展
大侠课堂20 小时前
互联网大厂面试题100道-阿里百度篇-完整版
百度·阿里云·面试·面试题·阿里
Heo21 小时前
关于XSS和CSRF,面试官更喜欢这样的回答!
前端·javascript·面试
神秘的猪头1 天前
🧱 深入理解栈(Stack):原理、实现与实战应用
前端·javascript·面试