java 并发编程中的ConcurrentModificationException 异常问题
时间:2021-09-13
本文章向大家介绍java 并发编程中的ConcurrentModificationException 异常问题,主要包括java 并发编程中的ConcurrentModificationException 异常问题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
云渲染服务中的 java.util.ConcurrentModificationException 异常问题
针对最近云渲染服务中的出现的一个问题进行反思与回顾
回调视频渲染进度问题
- 在修改过回调进度的 url 后,启用了之前的代码片段。导致之前的漏洞被爆出:在多线程编程中,直接使用 hashmap 来保存当前的渲染任务,而不进行一些必要的线程间的互斥与同步操作,导致在一个线程通过迭代器遍历 hashmap 时,另一个线程同时修改 hashmap,导致程序抛出
java.util.ConcurrentModificationException 异常
程序后续也没有处理该异常,导致任务不断失败java.util.ConcurrentModificationException at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493) at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516) at com.seeshion.schedule.ProcessTask.test(ProcessTask.java:39) at jdk.internal.reflect.GeneratedMethodAccessor32.invoke(Unknown Source) ...
解决办法
-
HashTable
可以使用 HashTable 来解决该问题,HashTable<K, V> 也是一种键值对结构的哈希表,和 HashMap 的操作大体一致,但不同的是:HashMap 不是线程安全的类,多线程环境下,HashMap 会出现并发冲突。而 HashTable 是线程安全的类,为了实现多线程安全,HashTable 使用 synchronized 锁住整张 Hash 表 即每次锁住整张表实现线程安,HashTable 几乎在所有的方法上都加了锁,但也导致了操作效率低下。在云渲染服务场景中,这点时间可以忽略不计。
-
ConcurrentHashMap
ConcurrentHashMap 是比 HashTable 效率更高的并发容器,使用了锁分离技术,即使用多个锁来锁住 Hash 表的不同部分,这些不同的部分成为 segment 段,每个段其实就是一个一个的 HashTable,每个段有他自己的锁,只要多个并发操作发生在不同的段上,就可以实现修改操作真正的并发执行
原文地址:https://www.cnblogs.com/zoule/p/15263269.html
- 简单易学的机器学习算法——Rosenblatt感知机的对偶解法
- Spring-拾遗
- Golang面试题
- 简单易学的机器学习算法——基于密度的聚类算法DBSCAN
- 厚土Go学习笔记 | 29. 接口
- Golang Template 简明笔记
- hotspare的copyback(r7笔记第30天)
- Spring-AOP
- DBA和开发同事的一些代沟(三)(r7笔记第29天)
- 简单易学的机器学习算法——非线性支持向量机
- 一条关于swap争用的报警邮件分析(一)(r7笔记第28天)
- Spring-IOC(2)
- Python3 pandas read_csv 读取txt文件报错:IOError: Initializing from file failed
- dataguard添加临时数据文件的bug(r7笔记第27天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Js获取域名地址并截取
- 引用lib-flexible导致第三方Ui库缩小
- Spring 定时任务框架详解(1)——快速入门
- Css实现圆形动态波浪
- Css实现一行或多行溢出显示省略号
- Spring 定时任务框架详解(3)——源码分析
- html2cavas实现生成图片
- ElasticSearch学习笔记(1)——简介
- ElasticSearch学习笔记(2)——插件安装和集群搭建
- Echartsjs图表的使用
- ElasticSearch学习笔记(3)——基础概念
- jQueryWEUI解决input框调起的软键盘和选择器重叠的问题
- (31)字符处理命令
- Js用forEach语法循环列表
- Vue项目打包部署到服务器