Java-为什么此程序不引发并发修改异常
我试图通过访问HashMap实例变量引用来引发并发修改异常,但该程序没有抛出错误。如果你能帮助我理解,我将不胜感激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
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同时访问的。我的理解是,如果同时访问或修改任何集合(添加、删除、替换..)然后应该通过并发修改。因为从技术上讲,对象是并发修改的。但是,只有在迭代而不是加法的情况下,它才是正确的。再次感谢。。