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也是一种键值对结构的哈希表,和 HashMap 的操作大体一致,但不同的是:HashMap 不是线程安全的类,多线程环境下,HashMap 会出现并发冲突。而 HashTable 是线程安全的类,为了实现多线程安全,HashTable 使用 synchronized 锁住整张 Hash 表 即每次锁住整张表实现线程安,HashTable 几乎在所有的方法上都加了锁,但也导致了操作效率低下。在云渲染服务场景中,这点时间可以忽略不计。
- 【java 并发编程中的ConcurrentModificationException 异常问题】ConcurrentHashMap
ConcurrentHashMap 是比 HashTable 效率更高的并发容器,使用了锁分离技术,即使用多个锁来锁住 Hash 表的不同部分,这些不同的部分成为 segment 段,每个段其实就是一个一个的 HashTable,每个段有他自己的锁,只要多个并发操作发生在不同的段上,就可以实现修改操作真正的并发执行
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用