Java-为什么此程序不引发并发修改异常

Java-为什么此程序不引发并发修改异常,java,multithreading,concurrent-programming,Java,Multithreading,Concurrent Programming,我试图通过访问HashMap实例变量引用来引发并发修改异常,但该程序没有抛出错误。如果你能帮助我理解,我将不胜感激 package Threads; import java.util.HashMap; public class ProducerConsumer { private HashMap<String, String> sharedMap = new HashMap<String,String>(); public void putMetho

我试图通过访问HashMap实例变量引用来引发并发修改异常,但该程序没有抛出错误。如果你能帮助我理解,我将不胜感激

package Threads;
import java.util.HashMap;

public class ProducerConsumer {

    private HashMap<String, String> sharedMap = new HashMap<String,String>();

    public void putMethod(){

        for (int count=0; count<100; count++)
        {
        System.out.println("Adding into sharedMap:"+count);
        sharedMap.put(Integer.toString(count),Integer.toString(count));
        }
    }

    public static void main(String [] args) throws InterruptedException{

    final ProducerConsumer pc1=new ProducerConsumer();
    Thread t1= new Thread( new Runnable(){

        @Override
        public void run() {
            pc1.putMethod();
        }

    });

    Thread t2= new Thread( new Runnable(){

        @Override
        public void run() {
            pc1.putMethod();
            }   
    });
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    }
}
包线程;
导入java.util.HashMap;
公共类生产者消费者{
私有HashMap sharedMap=newhashmap();
公共方法(){

对于(int count=0;count异常需要由类上正在调用的实现方法引发。从Javadoc来看,HashMap迭代器似乎是快速失败迭代器;这意味着如果在添加时进行迭代,它将引发异常。如果键不存在,add方法将向映射中添加项,如果键不存在,则替换它oes,我不认为这会抛出您试图产生的异常。

方法
add()
不会检测并发修改,因此不会抛出
ConcurrentModificationException
(匿名者已经说过)

然而,同时访问HashMap可能是危险的

如果并行读取
HashMap
,则可以强制执行
ConcurrentModificationException

...
public void putMethod() { ... }
public void iterateMethod() {
    sharedMap.keySet().stream().forEach((s) -> {
        System.out.println("Read key " + s);
    }
}

public static void main(String[] args) throws InterruptedException {
    ...
    t1.start();
    Thread.sleep(20); // sleep time depends on your computer's speed ;-)
    t2.start();
    ...
}
...

谢谢..在我最初发布的代码中,sharedMap对象是由线程1和线程2同时访问的。我的理解是,如果同时访问或修改任何集合(添加、删除、替换..)然后应该通过并发修改。因为从技术上讲,对象是并发修改的。但是,只有在迭代而不是加法的情况下,它才是正确的。再次感谢。。