讲师中心 微信公众号
AI工具推荐 视频效率加速

Java中 fail-fast 机制在 Fastjson 校验 JSONObject 迭代时的并发修改

轻雪君_1243

轻雪君_1243

发布时间:2026-07-28 10:23:20

|

173人浏览过

|

来源于php中文网

原创

Java中fail-fast机制不直接作用于Fastjson的JSONObject,因其非标准集合类、无modCount字段及fail-fast校验逻辑;其迭代行为取决于底层Map类型(如HashMap则间接具备fail-fast能力,ConcurrentHashMap则为fail-safe)。

java中 fail-fast 机制在 fastjson 校验 jsonobject 迭代时的并发修改

Java 中的 fail-fast 机制本身不作用于 Fastjson 的 JSONObject 迭代过程,因为 JSONObject(来自 Alibaba Fastjson)*不是标准 Java 集合框架(`java.util.)的实现类**,它不继承AbstractCollectionAbstractList,也不维护modCount字段,更不使用Iterator` 的 fail-fast 检查逻辑。

换句话说:
ArrayList.iterator()HashMap.entrySet().iterator() 等会触发 ConcurrentModificationException,是因其实现了标准 fail-fast 协议;
JSONObjectkeySet()entrySet()forEach() 遍历默认不带 fail-fast 行为——它不会在遍历时检测并发修改,也不会抛出 ConcurrentModificationException


为什么 JSONObject 不触发 fail-fast?

Fastjson 的 JSONObject 本质是一个 HashMap<String, Object> 的包装类(v1.x)或基于 LinkedHashMap 的扩展(v2.x),但它的迭代器并未重写或继承标准集合的 Itr。其 keySet() 返回的是底层 map 的 keySet 视图,而该视图的迭代器行为取决于底层 map:

  • 若底层是 HashMap(非线程安全),其 keySet().iterator() 是 fail-fast 的 → 此时可能抛 ConcurrentModificationException
  • 若底层是 ConcurrentHashMap(如某些自定义构造),则迭代器是弱一致性(fail-safe),不会抛该异常;
  • Fastjson v1 默认用 HashMap;v2 默认用 LinkedHashMap,二者均属 java.util 包,其迭代器继承 AbstractMap 的 fail-fast 实现 → 所以间接具备 fail-fast 能力

⚠️ 关键点:

JSONObject 自身不控制迭代器逻辑,真正起作用的是它内部持有的 Map 实例类型及其迭代器实现

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

jm-jsjkxyjs02-pzl-803
jm-jsjkxyjs02-pzl-803

查询全球任意城市的实时天气和未来天气预报

下载

常见场景与风险

场景1:单线程中边遍历边修改 JSONObject

JSONObject obj = new JSONObject();
obj.put("a", 1);
obj.put("b", 2);

for (String key : obj.keySet()) {
    if ("a".equals(key)) {
        obj.remove("b"); // ⚠️ 可能触发 ConcurrentModificationException
    }
}

→ 实际是否抛异常,取决于 obj 底层 map 类型及 JDK 版本。
HashMap 在 JDK 8+ 中,keySet().iterator()next() 方法会在每次调用时检查 modCount删除操作会改变 modCount,导致下一次 hasNext()next() 抛异常

场景2:多线程读写 JSONObject

  • 多个线程同时调用 obj.put() / obj.remove() + obj.forEach(...)
  • HashMap 非线程安全 → 除 ConcurrentModificationException 外,还可能引发死循环(JDK 7)、数据丢失、NullPointerException未定义行为
  • 这不是 fail-fast 的“保护”,而是底层 map 的并发缺陷。

如何安全迭代并修改?

目标 推荐方式
单线程安全修改 使用 Iterator.remove()(如果底层 map 支持)
java<br>Iterator<String> it = obj.keySet().iterator();<br>while (it.hasNext()) {<br> String k = it.next();<br> if ("a".equals(k)) it.remove(); // ✅ 安全<br>}<br>
避免 CME 异常 先收集待删 key,遍历结束后统一删:
java<br>List<String> toRemove = new ArrayList<>();<br>for (String k : obj.keySet()) {<br> if (needRemove(k)) toRemove.add(k);<br>}<br>toRemove.forEach(obj::remove);<br>
多线程环境 不要用 JSONObject 做共享可变状态
✅ 改用线程安全容器(如 ConcurrentHashMap
✅ 或用 CopyOnWriteArrayList 存储 JSON 对象
✅ 或加 synchronized 锁住整个 JSONObject 实例

注意:Fastjson 本身不是线程安全的序列化/反序列化工具(尤其 v1.x),JSONObject 实例也不承诺线程安全。共享可变 JSONObject 是设计隐患,应尽量避免。


Fastjson v2 的变化(补充)

Fastjson2(com.alibaba.fastjson2.JSONObject)改用不可变/线程友好的设计倾向:

  • 默认构造器创建的是 LinkedHashMap 实例(仍 fail-fast);
  • 提供 JSONFactory 可指定底层 map 类型;
  • 明确文档指出:JSONObject 实例不保证线程安全,多线程并发读写需外部同步

所以,无论 v1 还是 v2,不要依赖 JSONObject 的迭代器做并发防护,它没有内置 fail-fast 校验逻辑,也不提供线程安全保障


本质上,所谓“Fastjson 校验 JSONObject 迭代时的并发修改”,并不是一个由 fail-fast 主动拦截的过程,而往往是底层 map 暴露的并发缺陷所引发的副作用。真正要解决的,是数据结构选型 + 访问控制 + 线程协作规范,而非等待某个异常来“提醒”。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

8857

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

6062

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

5432

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

984

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

808

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

1156

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2349

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

19671

2023.08.03

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

0

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
FastJson教程手册
FastJson教程手册

共25课时 | 36.2万人学习

Lua 5.3 中文开发手册
Lua 5.3 中文开发手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn