0

0

Java同步容器与并发工具类的语法

P粉602998670

P粉602998670

发布时间:2026-02-02 11:10:36

|

772人浏览过

|

来源于php中文网

原创

同步容器通过对象级 synchronized 锁导致高竞争、低并发;ConcurrentHashMap 读操作无锁、分段/细粒度锁提升性能;putIfAbsent 直接插入预计算值,computeIfAbsent 按需调用函数生成值。

java同步容器与并发工具类的语法

Java同步容器的底层锁机制怎么影响性能

同步容器如 VectorHashtableCollections.synchronizedList() 本质是用 synchronized 方法或代码块包裹所有公共操作,锁粒度是整个对象。这意味着即使两个线程分别读写不同索引的 Vector,也会互相阻塞。

  • Vectoradd()get()size() 全部加在 this 上,无法并发执行
  • Collections.synchronizedMap(new HashMap()) 同样对每个方法单独同步,但迭代时仍需手动同步:必须用 synchronized(map) { ... } 包裹 iterator(),否则抛 ConcurrentModificationException
  • 高并发下吞吐量远低于 ConcurrentHashMap,尤其在读多写少场景——同步容器读操作也被锁住,而 ConcurrentHashMap 读操作无锁

ConcurrentHashMap 的 putIfAbsent 和 computeIfAbsent 区别在哪

这两个方法都用于条件写入,但语义和执行时机不同:

  • putIfAbsent(K key, V value):只接受已计算好的 value,原子判断 key 是否不存在,若不存在则直接插入;适合值构造开销小、无副作用的场景
  • computeIfAbsent(K key, Function super K, ? extends V> mappingFunction):仅当 key 不存在时才调用 mappingFunction 计算值,且该函数在持有内部段锁(JDK8+为 Node 级锁)期间执行;适合值需动态构建(如查数据库、解析 JSON),且希望避免重复计算
  • 注意:mappingFunction 内不能调用本 ConcurrentHashMap 的其他修改方法(如 put),否则可能死锁;也不应有阻塞或长耗时逻辑,会拖慢整个桶的写操作
ConcurrentHashMap> cache = new ConcurrentHashMap<>();
// 安全:lambda 在锁内执行,只对当前 key 所在 bin 加锁
cache.computeIfAbsent("user:1001", k -> fetchRolesFromDB(k));

CopyOnWriteArrayList 为什么适合读多写少但不适合实时性要求高的场景

CopyOnWriteArrayList 每次写操作(addremove)都会复制整个底层数组,读操作则直接访问当前数组引用,无锁且不会阻塞。

php中级教程之ajax技术
php中级教程之ajax技术

AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。它不是新的编程语言,而是一种使用现有标准的新方法,最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容,不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。《php中级教程之ajax技术》带你快速

下载
  • 优点:遍历时完全不怕 ConcurrentModificationException,适合监听器列表、回调注册等写极少、读极频繁且允许短暂 stale 的场景
  • 缺点:写操作内存与 CPU 开销大;新写入的元素对正在遍历的迭代器不可见——即“最终一致性”,不是实时可见
  • 不能用于需要强一致性的计数、状态同步等逻辑;例如 list.size() 返回的是快照大小,但紧接着调用 list.get(0) 可能越界(因其他线程刚清空了 list)

BlockingQueue 实现类该怎么选:ArrayBlockingQueue vs LinkedBlockingQueue vs SynchronousQueue

三者都是线程安全的阻塞队列,但数据结构和行为差异显著:

立即学习Java免费学习笔记(深入)”;

  • ArrayBlockingQueue:固定容量、基于数组、单锁(ReentrantLock),生产/消费共用一把锁;吞吐量中等,内存占用可控,适合容量明确、追求稳定延迟的场景
  • LinkedBlockingQueue:可选容量(默认 Integer.MAX_VALUE)、基于链表、双锁(takeLockputLock 分离);读写可并行,吞吐更高,但可能因无界导致 OOM
  • SynchronousQueue:不存储元素,每个 put() 必须等待配对的 take(),反之亦然;适合任务交接(如 Executors.newCachedThreadPool()),零缓冲,延迟最低,但使用不当易造成线程阻塞堆积
// 错误:无界 LinkedBlockingQueue 在高吞吐下游阻塞时会无限堆积
new LinkedBlockingQueue<>(); // 应显式指定 capacity

// 正确:带界队列 + 拒绝策略更可控
new ArrayBlockingQueue<>(1000);
真正容易被忽略的是锁粒度与一致性模型的隐含契约:比如 ConcurrentHashMap 不保证全局迭代一致性,CopyOnWriteArrayList 的写操作会触发 full copy,而 SynchronousQueue 表面轻量,实则把背压完全交给了线程调度。选错一个,问题往往在压测后期才暴露。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

546

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

61

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.27

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

485

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

163

2023.10.07

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

0

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.3万人学习

Java 教程
Java 教程

共578课时 | 55.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号