当前位置: 首页 > 后端技术 > Java

java并发编程中ConcurrentModificationException异常问题

时间:2023-04-01 14:37:23 Java

云渲染服务中java.util.ConcurrentModificationException异常问题最近重新思考和回顾云渲染服务中的一个问题回调视频渲染进度的问题修改在url中回调进度,之前的代码片段已启用。之前暴露的漏洞:在多线程编程中,直接使用hashmap来保存当前渲染任务,没有进行一些必要的线程间互斥和同步操作,导致一个线程通过迭代器遍历hashmap时,另一个线程同时修改hashmap,导致程序抛出java.util.ConcurrentModificationExceptionjava.util.ConcurrentModificationExceptionatjava.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1493)atjava.base/java.util.HashMap$KeyIterator.next(HashMap.java:1516)atcom.seeshion.schedule.ProcessTask.test(ProcessTask.java:39)atjdk.internal.reflect.GeneratedMethodAccessor32.invoke(UnknownSource)...程序后续也没有处理异常,导致任务不断失败。解决方法HashTable可以使用HashTable来解决这个问题。HashTable也是键值对结构的哈希表,与HashMap大致相同,不同的是:HashMap不是线程安全类。在多线程环境下,HashMap会存在并发冲突。HashTable是一个线程安全的类。HashTable为了实现多线程安全,使用synchronized对整个Hash表进行加锁,即每次对整个表进行加锁,以实现线程安全。HashTable对几乎所有的方法都加了锁,但是也造成了运行效率低下。在云渲染服务场景下,这个时间可以忽略不计。ConcurrentHashMapConcurrentHashMap是一个比HashTable更高效的并发容器。它采用了锁分离技术,即使用多把锁分别锁住Hash表的不同部分。这些不同的部分成为段段。每个段实际上是一个哈希表。每个段都有自己的锁。只要在不同的段上发生多个并发操作,就可以实现修改操作的真正并发执行。

猜你喜欢