关于后端:java-并发编程中的ConcurrentModificationException-异常问题

6次阅读

共计 1012 个字符,预计需要花费 3 分钟才能阅读完成。

云渲染服务中的 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,每个段有他本人的锁,只有多个并发操作产生在不同的段上,就能够实现批改操作真正的并发执行

正文完
 0