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