你使用过哪些 Java 并发工具类?
你的回答(口语化,面试场景)
面试官:你使用过哪些 Java 并发工具类?
你:
好的,我结合项目经验来说说常用的并发工具类:
- CountDownLatch
- 作用:等所有线程就绪后再触发任务,或主线程等待子线程完成。
- 场景:压测时模拟高并发(比如100个请求同时发起)。
- 代码示例:
CountDownLatch latch = new CountDownLatch(3); // 三个子线程执行任务 executor.submit(() -> { doWork(); latch.countDown(); }); latch.await(); // 主线程阻塞等待 System.out.println("所有任务完成");
- CyclicBarrier
- 作用:让一组线程互相等待,达到屏障点后统一执行后续逻辑。
- 场景:多线程分阶段处理数据(比如先各自加载数据,再统一合并)。
- 代码示例:
CyclicBarrier barrier = new CyclicBarrier(3, () -> System.out.println("全部就绪!")); executor.submit(() -> { loadData(); barrier.await(); // 等待其他线程 mergeData(); });
- Semaphore
- 作用:控制并发线程数(比如限流)。
- 场景:数据库连接池限制、接口限流(防止瞬时流量打满系统)。
- 代码示例:
Semaphore semaphore = new Semaphore(5); // 允许5个线程同时执行 if (semaphore.tryAcquire(2, TimeUnit.SECONDS)) { // 超时等待 try { accessDB(); } finally { semaphore.release(); } }
- ReentrantLock 和 StampedLock
- ReentrantLock:
- 可替代
synchronized,支持公平锁、可中断锁。 - 场景:需要尝试获取锁(
tryLock())或避免死锁(比如支付超时回滚)。
- 可替代
- StampedLock:
- 读多写少场景优化,通过“乐观读”减少锁竞争。
- 场景:高频读、低频写的缓存(比如商品库存缓存)。
- 原子类(AtomicInteger 等)
- 作用:无锁线程安全操作(基于 CAS)。
- 场景:计数器(比如统计接口调用次数)、状态标志。
AtomicInteger counter = new AtomicInteger(0); counter.incrementAndGet(); // 线程安全自增
- Future 和 CompletableFuture
- Future:异步获取任务结果(需配合线程池)。
- CompletableFuture:
- 支持链式调用、组合多个异步任务(如
thenApply()、allOf())。 - 场景:微服务并行调用(比如同时查询订单和用户信息)。
- 支持链式调用、组合多个异步任务(如
- 线程池工具类(Executors)
- 常用线程池:
newFixedThreadPool:固定线程数,适用于稳定负载。newCachedThreadPool:弹性线程数,适合短时异步任务。newScheduledThreadPool:定时任务调度(替代 Timer)。
- 注意:阿里规约建议手动创建
ThreadPoolExecutor,避免资源耗尽风险。
- 并发集合(ConcurrentHashMap、CopyOnWriteArrayList)
- ConcurrentHashMap:
- 分段锁(JDK7)或 CAS + synchronized(JDK8),高并发下替代 HashMap。
- 场景:全局缓存(比如电商首页类目数据)。
- CopyOnWriteArrayList:
- 写时复制,读多写少场景(比如监听器列表)。
预测面试官可能的追问及回答
追问1:CountDownLatch 和 CyclicBarrier 有什么区别?
回答:
- 触发机制:
CountDownLatch通过countDown()减计数,await()阻塞直到计数归零,一次性使用。CyclicBarrier通过await()等待线程数达标后触发回调,可重复使用(reset())。
- 场景:
CountDownLatch主等子,CyclicBarrier子等子。
追问2:ReentrantLock 和 synchronized 怎么选?
回答:
- 优先
synchronized:代码简洁,JVM自动管理锁。 - 需要高级功能时用
ReentrantLock:比如尝试获取锁(tryLock)、公平锁、可中断锁。
知识框架与底层原理补充
-
并发工具分类
| 类别 | 工具类 | 解决的核心问题 |
|--------------------|------------------------------------------|-------------------------------|
| 线程协作 |CountDownLatch,CyclicBarrier| 多线程步调协调 |
| 资源控制 |Semaphore, 线程池 | 限制并发资源使用 |
| 锁机制 |ReentrantLock,StampedLock| 显式控制同步与互斥 |
| 线程安全容器 |ConcurrentHashMap,CopyOnWriteArrayList| 高并发下数据安全访问 |
| 异步任务 |Future,CompletableFuture| 非阻塞任务编排与结果获取 | -
底层原理
- AQS(AbstractQueuedSynchronizer):
ReentrantLock、Semaphore、CountDownLatch均基于 AQS 实现,通过state变量和 CLH 队列管理线程阻塞与唤醒。
- CAS(Compare-And-Swap):
- 原子类(如
AtomicInteger)和ConcurrentHashMap的线程安全操作依赖 CAS,避免锁竞争。
- 原子类(如
- 写时复制(Copy-On-Write):
CopyOnWriteArrayList在写入时复制整个数组,保证读操作无锁,适合读多写极少场景。
- 最佳实践
- 避免死锁:
- 锁顺序一致、超时释放(
tryLock)、使用并发集合替代手动同步。
- 锁顺序一致、超时释放(
- 性能优化:
- 读多写少用
StampedLock,写多用ReentrantLock。 - 短任务用
CompletableFuture而非阻塞线程池。
- 读多写少用
- 线程池参数:
- 根据任务类型(CPU 密集型 vs IO 密集型)设置核心线程数(CPU 数 +1 或 2*CPU 数)。
- 高频面试题扩展
ConcurrentHashMap在 JDK7 和 JDK8 的区别?- JDK7:分段锁(Segment),锁粒度粗。
- JDK8:CAS + synchronized 锁单个 Node,粒度更细。
CompletableFuture的默认线程池问题?- 默认使用
ForkJoinPool.commonPool(),建议自定义线程池避免业务阻塞公共池。
- 默认使用
通过理解这些工具类的设计意图和底层机制,你可以在面试中展现出对高并发场景的深刻掌控力!
相关文章:
你使用过哪些 Java 并发工具类?
你的回答(口语化,面试场景) 面试官:你使用过哪些 Java 并发工具类? 你: 好的,我结合项目经验来说说常用的并发工具类: CountDownLatch 作用:等所有线程就绪后再触发任务…...
模板方法模式的C++实现示例
核心思想 模板方法设计模式是一种行为设计模式,它定义了一个算法的框架,并将某些步骤的具体实现延迟到子类中。通过这种方式,模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法模式的核心在于: …...
国产编辑器EverEdit - 脚本(解锁文本编辑的无限可能)
1 脚本 1.1 应用场景 脚本是一种功能扩展代码,用于提供一些编辑器通用功能提供不了的功能,帮助用户在特定工作场景下提高工作效率,几乎所有主流的编辑器、IDE都支持脚本。 EverEdit的脚本支持js(语法与javascript类似)、VBScript两种编程…...
越早越好!8 个反直觉的金钱真相|金钱心理学
很多人都追求财富自由,但成功的人少之又少。 这可能是因为,人们往往忽略了一些金钱的真相和常识。 01 金钱常识 & 真相 为了构建健康的金钱观,我读了一本有点反直觉,有点像鸡汤,但都是财富真相的书。 来自 Morg…...
linux docker相关指令
1、镜像操作 0)、搜索:docker search 镜像名称 1)、拉取:docker pull 2)、推送:docker push 3)、查看:docker images 4)、查看所有镜像ID:d…...
实时采集到的语音进行语音识别
要在.NET Framework 4.8中使用C#实现离线实时语音识别,可以使用开源库Vosk(支持离线ASR)配合音频处理库NAudio。 步骤 1:安装依赖库 1.1. 安装NuGet包: - Install-Package NAudio(处理音频输入)…...
Ollama 本地部署 DeepSeek R1 及 Python 运行 open-webui 界面(windows)
DeepSeek R1 ollama open-webui 本地部署(windows) DeepSeek-R1本地部署配置要求 Github地址:https://github.com/deepseek-ai/DeepSeek-R1?tabreadme-ov-file 模型规模最低 GPU 显存推荐 GPU 型号纯 CPU 内存需求适用场景1.5B4GBRTX 3…...
牛客周赛:84:C:JAVA
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 \hspace{15pt}本题为《D.小红的陡峭值(三)》的简单版本,两题的唯一区别在于本题的数据范围更小。 \hspace{15pt}小红定义一个字符串的陡峭值为&a…...
5. 前后端实现文件上传与解析
1. 说明 在实际开发中,比较常见的一个功能是需要在前端页面中选择系统中的某个文件上传到服务器中进行解析,解析后的文件内容可以用来在服务器中当作参数,或者传递给其它组件使用,或者需要存储到数据库中。所以本文就提供一种方式…...
SpringBoot 接入 豆包 火山方舟大模型
火山方舟控制台 开通模型推理、知识库 应用入口; 文档中心 各类接口说明及SDK 获取; 向量数据库VikingDB 文档 下翻找到有java操作案例; 实现目标功能效果: 通过SDK调用 豆包大模型,在代码内实现问答的效果…...
IDEA接入阿里云百炼中免费的通义千问[2025版]
安装deepseek 上一篇文章IDEA安装deepseek最新教程2025中说明了怎么用idea安装codeGPT插件,并接入DeepSeek,无奈接入的官方api已经不能使用了,所以我们尝试从其他地方接入 阿里云百炼https://bailian.console.aliyun.com/ 阿里云百炼是阿…...
下载kali linux遇到的一些问题
kali官网:kali官网跳转 问题一:未启动VM Service VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动VMware Authorization Service。如果此问题仍然存在,请联系VMware 支持部门。 解决办法: 步骤1…...
常见排序算法深度评测:从原理到10万级数据实战
常见排序算法深度评测:从原理到10万级数据实战 摘要 本文系统解析冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序和基数排序8种经典算法,通过C语言实现10万随机数排序并统计耗时。测试显示:快速排序综合性能最优&…...
Scaled_dot_product_attention(SDPA)使用详解
在学习huggingFace的Transformer库时,我们不可避免会遇到scaled_dot_product_attention(SDPA)这个函数,它被用来加速大模型的Attention计算,本文就详细介绍一下它的使用方法,核心内容主要参考了torch.nn.functional中该函数的注释…...
Linux练级宝典->Linux进程概念介绍
目录 进程基本概念 PCB概念 task_struct tack_struct内容分类 PID和PPID fork函数创建子进程 进程优先级概念 4个名词 进程地址空间 进程地址空间的意义 内核进程调度队列 优先级 活动队列 过期队列 进程基本概念 一个正在执行的程序。担当分配系统资源的实体&#…...
OpenHarmony 5.0 mpegts封装的H265视频播放失败的解决方案
问题现象 OpenHarmony 5.0版本使用AVPlayer播放mpegts封装格式的H.265(HEVC)编码格式的视频时出现报错导致播放失败 问题原因 OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎,因为 libav_codec_hevc_parser.z.so 动态库未开源导致H265编码格式视频解析不到…...
Qt从入门到入土(九) -model/view(模型/视图)框架
简介 Qt的模型/视图(Model/View)架构是一种用于分离数据处理和用户界面展示的设计模式。它允许开发者将数据存储和管理(模型)与数据的显示和交互(视图)解耦,从而提高代码的可维护性和可扩展性。…...
缓存之美:Guava Cache 相比于 Caffeine 差在哪里?
大家好,我是 方圆。本文将结合 Guava Cache 的源码来分析它的实现原理,并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易,我们还是在开篇介绍它的原理: Guava Cache 通过分段(…...
[漏洞篇]XSS漏洞详解
[漏洞篇]XSS漏洞 一、 介绍 概念 XSS:通过JS达到攻击效果 XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以…...
【Leetcode 每日一题】2269. 找到一个数字的 K 美丽值
问题背景 一个整数 n u m num num 的 k k k 美丽值定义为 n u m num num 中符合以下条件的 子字符串 数目: 子字符串长度为 k k k。子字符串能整除 n u m num num。 给你整数 n u m num num 和 k k k,请你返回 n u m num num 的 k k k 美丽值…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
