Java- 为什么这个程序不抛出并发修改异常

Java- Why this program not throwing concurrent Modification exception

我试图通过访问 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();
    }
}

class 上调用的实现方法需要抛出异常。从 Javadoc 看来,HashMap 迭代器是快速失败的迭代器;这意味着如果您在添加时进行迭代,它将抛出它。如果键不存在,则 add 方法会将项目添加到地图中,如果存在,则将其替换,我认为这不会引发您尝试生成的异常。

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

但是,并发访问 HashMap 可能很危险。 Read more about this in another post.

如果您并行读取 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();
    ...
}
...