Tag: concurrentmodification

为什么在一个线程迭代(使用Iterator)和其他线程修改非线程安全的ArrayList的相同副本时没有ConcurrentModificationException

一些背景: 当使用Iterator一个集合时,可能会有java.util.ConcurrentModificationException因为在创建Iterator对象的时候,会捕获集合或ArrayList的修改计数( modCount ),并在每次迭代时使用Iterator.next()它检查modCount是否已更改,如果是,则抛出java.util.ConcurrentModificationException 。 在创建迭代器对象时(来自ArrayList的Iterator实现): int expectedModCount = modCount; 下面的方法在Iterator.next()调用,它抛出exception(来自ArrayList的Iterator实现): final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } 我可以使用下面的代码很好地重现它: List stringList = new ArrayList(); stringList.add(“a”); stringList.add(“b”); stringList.add(“c”); Iterator iterator = stringList.iterator(); System.out.println(“Got iterator object”); while (iterator.hasNext()) { String player = iterator.next(); player.toString(); System.out.println(“UpperCase: ” + player.toUpperCase()); iterator.remove(); stringList.add(“a1”); //This is […]

如何在没有ConcurrentModificationException的情况下对Collection 进行交互并修改其项目?

我需要做这样的事…… Collection myCollection; ///assume it is initialized and filled for(Iterator index = myCollection.iterator(); index.hasNext();) { Object item = index.next(); myCollection.remove(item); } 显然这会抛出ConcurrentModificationException … 所以我尝试了这个但是看起来并不优雅/高效并抛出类型安全:从Object到T的未经检查的强制转换警告 Object[] list = myCollection.toArray(); for(int index = list.length – 1; index >= 0; index–) { myCollection.remove((T)list[index]); }

如何在并发线程中操作`values()`和`put()`时避免使用HashMap“ConcurrentModificationException”?

码: 我有一个HashMap private Map map = new HashMap(); 一种方法是通过调用put(K,V)将KV对放入其中。 另一种方法想从其值中提取一组随机元素: int size = map.size(); // size > 0 V[] value_array = map.values().toArray(new V[size]); Random rand = new Random(); int start = rand.nextInt(size); int end = rand.nextInt(size); // return value_array[start .. end – 1] 这两个方法在两个不同的并发线程中调用。 错误: 我收到了一个ConcurrentModificationException错误: at java.util.HashMap$HashIterator.nextEntry(Unknown Source) at java.util.HashMap$ValueIterator.next(Unknown Source) at java.util.AbstractCollection.toArray(Unknown Source) […]

ConcurrentModificationException甚至在LinkedHashMap上使用Collections.sychronizedMap

我在我的类中使用了一个Map对象,我已经与LinkedHashMap的Collections.synchronizedMap()同步,如下所示: private GameObjectManager(){ gameObjects = Collections.synchronizedMap(new LinkedHashMap()); } 我在这个函数的第三行得到一个并发修改exception: public static void frameElapsed(float msElapsed){ if(!INSTANCE.gameObjects.isEmpty()){ synchronized(INSTANCE.gameObjects){ for(GameObject object : INSTANCE.gameObjects.values()){…} } } } 我正在迭代Map的所有其他位置,我按照文档在地图上进行同步。 我的类中还有其他函数使用这个Map(同步的!)和put()和remove()对象,但这应该不重要。 我究竟做错了什么? 请询问更多代码,不知道还有什么要放。 哦,和日志消息: 08-20 15:55:30.109: E/AndroidRuntime(14482): FATAL EXCEPTION: GLThread 1748 08-20 15:55:30.109: E/AndroidRuntime(14482): java.util.ConcurrentModificationException 08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:350) 08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$ValueIterator.next(LinkedHashMap.java:374) 08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GameObjectManager.frameElapsed(GameObjectManager.java:247) 08-20 […]

Collection – Iterator.remove()vs Collection.remove()

按照Sun, “Iterator.remove是在迭代期间修改集合的唯一安全方法;如果在迭代进行过程中以任何其他方式修改基础集合,则行为未指定。” 我有两个问题: 是什么让这个操作“Iterator.remove()”比其他操作稳定? 如果它在大多数用例中没用,它们为什么提供“Collection.remove()”方法呢?

java.util.ConcurrentModificationException&iteration?

我是Arraylists和迭代器的新手,这是我第一次遇到这个例外。 我有一个ArrayList你想我做以下算法: for (Character c:u){ if(k==1){ //base case if(isAnswer(s+u.get(0))) System.out.println(s+u.get(0)+” is the correct sequence.”+ ‘\n’); return; } else{ u.remove(c); puzzleSolve(k-1, s+c , u); u.add(c); removeLastChar(s); } } //end of for each 当我搜索这个exception时,我发现我无法删除每个arrayl上的iterms weth并且我需要使用迭代器,但是我很困惑我在哪里以及如何确定我必须放入while(iter.hasNext())这段代码就是这样的东西。 如果你能帮助我,我将不胜感激 PS。 s是String(最初为空)&k是int

arraylist并发修改

我正在用java创建一个multithreading聊天。 当用户u1向用户u2发送消息但用户u2未连接时,用户u1将消息发送给服务器,用户u2将在连接到服务器后收到消息。 未发送的消息将添加到ArrayList。 一旦用户连接,他就会检查他是否是待处理消息的接收者。 如果是,则将消息发送给他,然后从待处理消息列表中删除。 我是这样做的: for(Iterator itpendingmsgs = pendingmsgs.iterator(); itpendingmsgs.hasNext();) { String pendingmsg = itpendingmsgs.next(); String dest = pendingmsg.substring(4); if (protocol.author.equals(dest)) { sendMsg(msg); pendingmsgs.remove(pendingmsg); } } 这就是我得到的: Exception in thread “Thread-3” java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Source) at ChatServer$ClientConnection.run(ChatServer.java:383) at java.lang.Thread.run(Unknown Source) 我如何解决它? 是因为我正在使用迭代器吗?

ConcurrentModificationException Woes

我有一个方法test(),其中我试图将两个LinkedHashMaps相互比较,并通过删除键/值对来修改其中一个映射的内容(如果在两个LHM中都找到它)。 运行此方法时,我不断收到ConcurrentModificationException。 我理解为什么我得到exception(因为我试图修改循环的列表)。 不过我不知道该怎么做。 到目前为止我有这个代码: private void test() { LinkedHashMaptestBene = new LinkedHashMap(); LinkedHashMaptestDly = new LinkedHashMap(); testBene.put(“ABCDEFG”, BigDecimal.ZERO); testBene.put(“BCDEFGH”, BigDecimal.ONE); testBene.put(“CDEFGHI”, BigDecimal.TEN); testDly.put(“BCDEFGH”, BigDecimal.ONE); testDly.put(“Foo”, BigDecimal.TEN); testDly.put(“Bar”, BigDecimal.TEN); for (Entry beneKeySet : testBene.entrySet()) { if (testDly.containsKey(beneKeySet.getKey())) { for (Entry dlyKeySet : testDly.entrySet()) { if ((dlyKeySet.getKey().equals(beneKeySet.getKey())) && dlyKeySet.getValue().equals(beneKeySet.getValue())) { testBene.remove(dlyKeySet.getKey()); } } } } }

在迭代列表时删除列表元素是否存在Java中公认的最佳实践?

我发现在执行此操作时避免出现ConcurrentModificationException的最佳方法存在冲突的建议: List Apples = appleCart.getApples(); for (Apple apple : Apples) { delete(apple); } 我倾向于使用Iterator代替List并调用其remove方法。 这在这里最有意义吗?

如何在Java中修改对象时迭代对象?

可能重复: Java:在迭代集合时高效等效删除 在迭代它时从java中的集合中删除项目 我正在尝试遍历HashMap : Map group0 = new HashMap(); …并提取group0每个元素。 这是我的方法: // iterate through all Members in group 0 that have not been assigned yet for (Map.Entry entry : group0.entrySet()) { // determine where to assign ‘entry’ iEntryGroup = hasBeenAccusedByGroup(entry.getKey()); if (iEntryGroup == 1) { assign(entry.getKey(), entry.getValue(), 2); } else { assign(entry.getKey(), entry.getValue(), 1); […]