java - 向 hashmap 添加值时出现 ConcurrentModificationException

标签 java multithreading concurrency

下面的代码在两个线程访问同一个线程时收到并发修改异常。

我想知道是否

  1. 如果使用并发Hashmap是否可以避免这个异常。
  2. 如果我们使用并发 hashmap 在多线程环境中会出现任何问题。

或者有其他方法可以防止这种异常吗?

我不打算使用同步,因为此代码是在轮询期间使用的。因为一个线程可能必须等待另一个线程完成执行。

代码是

HashMap<Integer, myModel> aServiceHash = new HashMap<Integer, myModel>();
HashMap<Integer, myModel> rServiceHash = new HashMap<Integer, myModel>();

for (myModel ser : serAccepted){
    aServiceHash.put(service.getOriginalDate(), ser);
}
for (myModel ser : serRequested) {
    if (aServiceHash.containsKey(service.getDate())) {
        aServiceHash.put(serv.getDate(), serv);
    }
    else 
        rServiceHash.put(service.getDate(), ser);
}

引用http://examples.javacodegeeks.com/java-basics/exceptions/java-util-concurrentmodificationexception-how-to-handle-concurrent-modification-exception/

http://www.journaldev.com/378/how-to-avoid-concurrentmodificationexception-when-using-an-iterator

How to avoid HashMap "ConcurrentModificationException" while manipulating `values()` and `put()` in concurrent threads?

使用 JSF 2.1、JDK 7.1。

最佳答案

HashMap 不是线程安全的。 ConcurrentHashMap是线程安全的。当从不同线程访问映射时,为了线程安全,最好是并发的。

是的,它将避免异常。从这个方向不会出现多线程问题。您仍然需要确保没有线程删除您稍后打算使用的内容。

防止异常的另一种方法是在每次插入之前锁定映射,无论是通过同步块(synchronized block)还是 Lock 对象。

关于java - 向 hashmap 添加值时出现 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27168330/

相关文章:

java - GAE 数据核不获取子实体

multithreading - 基本多线程

c# - 如何实现线程安全列表?

c# - 线程有等待语句吗?

android - 是否可以检测 Activity 是否暂停? (线程问题)

concurrency - golang中的多并发

java - ConcurrentLinkedHashMap.Builder如何处理删除和获取?

java - 避免重复值

java - 将带有自定义调色板的 Java Image 对象保存到 GIF 文件的最佳方法

java - 从 Firebase 返回单个值