java集合同步映射不工作

java集合同步映射不工作,java,Java,当我多次运行下面的代码时,下面的代码给出了ConcurrentModificationException。 当我使用nonconcurrentHashMap时,它工作正常 public static void main(String[] args) { Map<String, String> stringSyncedMap = Collections.synchronizedMap(new HashMap<String, String>());

当我多次运行下面的代码时,下面的代码给出了
ConcurrentModificationException
。 当我使用non
concurrentHashMap
时,它工作正常

    public static void main(String[] args) {

        Map<String, String> stringSyncedMap = Collections.synchronizedMap(new HashMap<String, String>());

        CollectionJob collectionJob1 = new CollectionJob(stringSyncedMap, "read");
        CollectionJob collectionJob2 = new CollectionJob(stringSyncedMap, "write");

        Thread thread1 = new Thread(collectionJob1, "T1");
        Thread thread2 = new Thread(collectionJob2, "T2");

        thread1.start();
        thread2.start();
    }

}

public class CollectionJob implements Runnable {

    private Map<String, String> stringCollection;
    private String operation;

    public CollectionJob(Map<String, String> stringCollection, String operation) {

        this.stringCollection = stringCollection;
        this.operation = operation;
    }

    public void run() {

        if (operation.equals("read"))
            readFromCollection();
        else
            writeToCollection();

        System.out.println("done");

    }

    public void writeToCollection() {
        for (int i = 10; i < 20; i++) {
            stringCollection.put("String " + i, "String"+i);

    }

    public void readFromCollection() {
        for (String str : stringCollection.keySet()) 
            System.out.println(str);
    }
}
publicstaticvoidmain(字符串[]args){
Map stringSyncedMap=Collections.synchronizedMap(新的HashMap());
CollectionJob collectionJob1=新的CollectionJob(stringSyncedMap,“读取”);
CollectionJob collectionJob2=新的CollectionJob(stringSyncedMap,“写入”);
螺纹螺纹1=新螺纹(collectionJob1,“T1”);
螺纹2=新螺纹(collectionJob2,“T2”);
thread1.start();
thread2.start();
}
}
公共类CollectionJob实现Runnable{
私人地图收藏;
私有字符串操作;
公共收集作业(映射字符串收集、字符串操作){
this.stringCollection=stringCollection;
这个操作=操作;
}
公开募捐{
if(操作等于(“读取”))
readFromCollection();
其他的
writeToCollection();
系统输出打印项次(“完成”);
}
公共无效writeToCollection(){
对于(int i=10;i<20;i++){
stringCollection.put(“String”+i,“String”+i);
}
public void readFromCollection(){
for(String str:stringCollection.keySet())
系统输出打印项次(str);
}
}

我缺少的内容。

ConcurrentHashMap
不同,当通过
集合初始化时,您需要在
映射上显式同步。synchronizedMap
习惯用法,例如使用
synchronized
关键字

从:

当用户迭代其任何集合视图时,必须手动同步返回的映射:[……]


请注意,
ConcurrentHashMap
明确防止
ConcurrentModificationException
(返回集合的“视图”)与大多数其他集合不同。您没有在代码中使用
ConcurrentHashMap
。这与
collections不同。synchronizedMap
返回的内容不同。@Kayaman重复的内容实际上并不相关。问题是ConcurrentHashMap和集合之间的区别。synchronizedMap@PaulBoddington我想买一个是的,这肯定是相关的,尽管它不是完全相同的。他的头衔也表明他可能不知道什么是
ConcurrentModificationException
。你可以投票重新打开吗?