java集合同步映射不工作
当我多次运行下面的代码时,下面的代码给出了java集合同步映射不工作,java,Java,当我多次运行下面的代码时,下面的代码给出了ConcurrentModificationException。 当我使用nonconcurrentHashMap时,它工作正常 public static void main(String[] args) { Map<String, String> stringSyncedMap = Collections.synchronizedMap(new HashMap<String, String>());
ConcurrentModificationException
。
当我使用nonconcurrentHashMap
时,它工作正常
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
。你可以投票重新打开吗?