第四章 JUC 常见并发工具类(java.util.concurrent,面试核心)
定位JUC是Java标准库提供的并发编程工具包包含任务封装、可重入锁、原子类、线程池、同步工具等比原生synchronized更灵活、功能更强。1. Callable 接口 FutureTask解决的问题Runnable的void run()没有返回值也不能抛出受检异常如果需要线程执行完带回结果原生写法需要自己写同步、等待、结果类代码繁琐易错。Callable 接口适合于想让某个线程执行一个逻辑并且返回结果的时候相比之下Runnable不关注结果public interface CallableV { V call() throws Exception; }带泛型V表示返回值的类型call()方法可以返回结果也可以抛出异常FutureTaskCallable不能直接传给Thread执行需要用FutureTask包装。作用保存Callable的执行结果主线程可以通过它阻塞等待任务完成并获取结果。通俗比喻点麻辣烫后厨开始做前台给你一张小票FutureTask随时可以凭小票看做好了没。完整代码示例// 定义带返回值的任务计算1~1000的和 CallableInteger callable new CallableInteger() { Override public Integer call() throws Exception { int sum 0; for (int i 1; i 1000; i) { sum i; } return sum; } }; FutureTaskInteger futureTask new FutureTask(callable); new Thread(futureTask).start(); // 主线程阻塞等待直到任务完成拿到结果 //此处的get就能获取到callable里面的 返回结果 //由于线程是并发执行的执行到主线程的get的时候t线程可能还没有执行完 //没有执行完的话就会阻塞 Integer result futureTask.get(); System.out.println(result);面试核心点Runnable无返回值不抛出受检异常Callable有返回值可抛出异常必须搭配FutureTask使用futureTask.get()阻塞等待任务执行完成获取返回值2. ReentrantLock 可重入互斥锁和synchronized定位相同都是实现线程互斥保证线程安全但ReentrantLock是Java类实现功能更灵活。基础用法ReentrantLock lock new ReentrantLock(); lock.lock(); // 加锁拿不到锁就死等 try { // 临界区业务代码 } finally { lock.unlock(); // 必须手动解锁写在finally防止异常遗漏 }增强功能tryLock(long timeout)尝试加锁等待指定时间还拿不到锁就放弃不会死等。公平锁支持构造方法传入true即可开启公平锁遵守先来后到。ReentrantLock fairLock new ReentrantLock(true); // 公平锁精准唤醒搭配Condition类可以指定唤醒某个/某组等待线程而synchronized的notify()只能随机唤醒一个。synchronized vs ReentrantLock 对比面试必背维度synchronizedReentrantLock实现层面JVM关键字底层C实现JDK标准库类Java代码实现锁释放退出同步块自动释放必须手动调用unlock加锁行为拿不到锁就死等lock()死等tryLock可超时放弃公平性只能非公平锁默认非公平可手动开启公平锁等待唤醒wait/notify随机唤醒Condition可精准唤醒指定线程锁类型可重入锁可重入锁选型建议锁竞争不激烈、代码简单优先用synchronized自动释放不易出错锁竞争激烈、需要超时放弃、公平锁、精准唤醒用ReentrantLock3. 原子类java.util.concurrent.atomic原理内部基于CAS volatile实现不需要加锁就能完成线程安全的数值操作性能远高于synchronized。常见原子类AtomicBoolean原子布尔值AtomicInteger原子整数AtomicLong原子长整型AtomicReference原子引用对象AtomicStampedReference带版本号的原子引用解决ABA问题AtomicInteger 常用方法方法作用对应普通操作getAndIncrement()返回旧值再自增iincrementAndGet()先自增返回新值igetAndDecrement()返回旧值再自减i--decrementAndGet()先自减返回新值--iaddAndGet(int delta)加上delta返回新值i delta面试考点AtomicInteger底层是CAS自旋实现的乐观锁不需要重量级锁高并发下性能优于synchronized。4. 线程池核心思想线程创建销毁比进程轻量但频繁创建销毁依然有开销。线程池提前创建一批线程复用任务来了直接分配线程执行任务完成线程不销毁放回池中等待下一个任务。Executors 工厂类快捷创建线程池Executors是线程池工厂类提供4种常用线程池底层都是封装ThreadPoolExecutor。工厂方法特点newFixedThreadPool(n)固定线程数量的线程池newCachedThreadPool()线程数动态伸缩空闲线程缓存复用newSingleThreadExecutor()只有一个线程任务串行执行newScheduledThreadPool(n)支持延迟、定时执行任务多线程版定时器注意生产环境不推荐直接用Executors因为部分线程池队列无界、最大线程数无界高并发下容易OOM。ThreadPoolExecutor 七大核心参数面试必考可以理解为开一家公司corePoolSize核心线程数正式员工常驻不辞退maximumPoolSize最大线程数正式员工 临时工的总上限keepAliveTime空闲存活时间临时工空闲多久就被辞退TimeUnit unit时间单位BlockingQueueRunnable workQueue阻塞任务队列存放等待执行的任务ThreadFactory threadFactory线程工厂统一创建线程可自定义线程名称RejectedExecutionHandler handler拒绝策略任务超过承载时的处理方式四种拒绝策略AbortPolicy【默认】直接抛出RejectedExecutionException异常CallerRunsPolicy由提交任务的线程自己执行这个任务DiscardOldestPolicy丢弃队列中排队最久的任务再尝试提交新任务DiscardPolicy直接丢弃新来的任务不抛异常线程池执行流程必背提交任务 → 核心线程未满 → 创建核心线程执行任务核心线程已满 → 任务进入阻塞队列排队队列也满了 → 创建非核心临时线程执行任务总线程数达到最大线程数 → 触发拒绝策略任务高峰过后非核心线程空闲超过keepAliveTime→ 销毁回收核心线程保留5. Semaphore 信号量锁本质也是一种特殊的信号量加锁操作p操作1-0 解锁操作V操作0-1 二元信号量核心作用表示可用资源的个数本质是一个原子计数器控制同时访问资源的最大线程数。PV操作acquire()P操作申请一个资源计数器-1计数器为0则阻塞等待release()V操作释放一个资源计数器1唤醒等待的线程通俗比喻PDF原文停车场剩余车位牌。车开进去车位-1开出来车位1车位为0时门口的车等待。代码示例// 初始4个许可最多4个线程同时执行 Semaphore semaphore new Semaphore(4); Runnable task () - { try { semaphore.acquire(); // 申请资源 System.out.println(获取到资源执行任务); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); // 释放资源 } }; // 启动20个线程最多同时4个运行 for (int i 0; i 20; i) { new Thread(task).start(); }适用场景限流、控制并发数、共享资源池管理。开发中需要申请资源的场景6. CountDownLatch 倒计时锁存器核心作用等待N个任务全部执行完成主线程再继续往下走。核心方法CountDownLatch(int count)构造方法指定需要等待的任务数量countDown()每个任务执行完调用一次计数器-1await()主线程调用阻塞等待直到计数器减到0通俗比喻跑步比赛10个选手就位枪响同时出发必须等所有选手都冲过终点才能公布成绩。代码示例// 等待10个任务全部完成 CountDownLatch latch new CountDownLatch(10); Runnable task () - { try { Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException e) {} latch.countDown(); // 任务完成计数减一 }; for (int i 0; i 10; i) { new Thread(task).start(); } latch.await(); // 主线程阻塞直到所有任务完成 System.out.println(全部任务执行完毕);适用场景多任务并行执行最后统一汇总结果主流程等待多个子任务全部完成。第四章 面试高频总结Callable带返回值FutureTask用来接收结果get()阻塞等待。ReentrantLock是可重入锁支持超时、公平锁、精准唤醒需要手动解锁。原子类基于CAS实现无锁线程安全适合高并发数值操作。线程池7大参数、4种拒绝策略、执行流程是面试必考题。Semaphore控制最大并发数CountDownLatch等待多任务全部完成。第四章的内容就全部梳理完了覆盖了PDF里所有工具类的定义、用法、比喻、场景和面试考点。确认理解后我们进入第五章线程安全集合类的详细讲解。

相关新闻

google-drive-ocamlfuse 的 DriveRootResolution 模块:根目录解析与合成知名资源的设计实现全解

google-drive-ocamlfuse 的 DriveRootResolution 模块:根目录解析与合成知名资源的设计实现全解

存储 【免费下载链接】google-drive-ocamlfuse FUSE filesystem over Google Drive 项目地址: https://gitcode.com/gh_mirrors/go/google-drive-ocamlfuse 点击查看 免费下载 本文围绕仓库中已归档的重构计划 drive-root-resolution-extraction/plan.md 展开&…

2026/10/12 12:25:52 阅读更多 →
AI大模型如何抓取和推荐淮南本地商户?GEO技术链路与POI权重算法拆解

AI大模型如何抓取和推荐淮南本地商户?GEO技术链路与POI权重算法拆解

一、技术背景:AI大模型正在重构本地服务流量分发 传统本地服务流量分发依赖搜索引擎关键词竞价、平台排名购买、信息流广告投放等付费模式。2026年1月起,豆包、DeepSeek、文心一言、通义千问等生成式AI大模型逐渐成为新一代本地服务查询入口。用户不再打…

2026/10/13 12:26:45 阅读更多 →
Pulse Relay Runtime 契约解析:桌面与移动端中继的端到端加密、持久化边界与移动能力治理

Pulse Relay Runtime 契约解析:桌面与移动端中继的端到端加密、持久化边界与移动能力治理

可观测性运维后端 【免费下载链接】Pulse Real-time monitoring dashboard for Proxmox VE, PBS, Docker, Kubernetes, TrueNAS and vSphere. Self-hosted, with smart alerts and AI patrols that catch silent failures. 项目地址: https://gitcode.com/gh_mirror…

2026/10/12 19:23:46 阅读更多 →

最新新闻

Service层命名规范:从见名知意到代码可维护性

Service层命名规范:从见名知意到代码可维护性

接手一个业务系统,我最怕看到的不是复杂算法,而是那种一打开就让人头晕的 Service 实现类。2000 行起步,方法名字从 process 到 handle 再到 doSomething,翻遍整个类也猜不出某个方法是干嘛的。命名这种事,看起来不影响…

2026/10/13 17:55:28 阅读更多 →
Windows内核模块枚举与隐藏原理深度解析

Windows内核模块枚举与隐藏原理深度解析

1. 这不是“找模块”,而是在内核内存里做一次精准外科手术“枚举和隐藏内核模块”——这八个字在安全研究、驱动开发或系统调试场景中,绝不是一句轻飘飘的技术术语。它背后是一整套对Windows内核运行时状态的深度观测与主动干预能力。我第一次在某高校实…

2026/10/13 17:55:28 阅读更多 →
Hibernate二级缓存Provider详解:从原理到选型与排坑

Hibernate二级缓存Provider详解:从原理到选型与排坑

被人突然问起“Hibernate的caching provider是什么”,我第一反应是:能问出这个词的人,多半已经看到配置文件里那一堆以hibernate.cache开头的键,但又没搞懂这些键到底在切换什么。这篇文章就把这个词拆开讲清楚,重点解…

2026/10/13 17:55:28 阅读更多 →
电能质量复合扰动识别:混沌集成决策树实战解析

电能质量复合扰动识别:混沌集成决策树实战解析

简介:这是一份面向电能质量复合扰动识别研究的MATLAB完整源程序包,对应知网论文《基于混沌集成决策树的电能质量复合扰动识别》,可作为电气工程、信号处理及机器学习方向的毕业设计或课题研究参考,帮助复现算法并开展对比实验。程…

2026/10/13 17:55:28 阅读更多 →
CentOS局域网DNS搭建:BIND9多域名权威解析实战

CentOS局域网DNS搭建:BIND9多域名权威解析实战

1. 为什么在CentOS上自建局域网DNS不是“多此一举”,而是刚需落地的第一步很多人看到“CentOS搭建局域网DNS”第一反应是:不就是改个/etc/resolv.conf?内网查个主机名用/etc/hosts不就完事了?我试过——在某高校实验室的物联网教学…

2026/10/13 17:55:28 阅读更多 →
ActiveMQ consumerCount精准获取与实战调优指南

ActiveMQ consumerCount精准获取与实战调优指南

1. 项目概述:为什么“获取消费者数量”是 ActiveMQ 运维与调优的黄金指标在某公司消息中间件团队的实际运维中,我接手的第一个紧急故障就和consumerCount直接相关——一个订单履约服务突然延迟飙升,下游库存扣减平均耗时从200ms暴涨到8秒。排…

2026/10/13 17:54:25 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →