美文网首页
java 并发编程中的ConcurrentModificatio

java 并发编程中的ConcurrentModificatio

作者: VE视频引擎 | 来源:发表于2021-09-13 17:09 被阅读0次

    云渲染服务中的 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,每个段有他自己的锁,只要多个并发操作发生在不同的段上,就可以实现修改操作真正的并发执行

    相关文章

      网友评论

          本文标题:java 并发编程中的ConcurrentModificatio

          本文链接:https://www.haomeiwen.com/subject/pdpfgltx.html