You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Chen (Jira)" <ji...@apache.org> on 2019/11/02 08:04:00 UTC
[jira] [Commented] (COLLECTIONS-663) Unexpected
ConcurrentModificationException when altering Collection of a
MultiValuedMap
[ https://issues.apache.org/jira/browse/COLLECTIONS-663?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16965269#comment-16965269 ]
Chen commented on COLLECTIONS-663:
----------------------------------
Hello, Gary D.Gregory
In this [PR|[https://github.com/apache/commons-collections/pull/108/files]], the testMultiValuedMapIterator() method test MapIterator.setValue() .That MapIterator.setValue() is really not supported。In ArrayListValuedHashMap, HashSetValuedHashMap, TransformedMultiValuedMap and UnmodifiableMultiValuedMap will throw UnsupportedOperationException when use MapIterator.setValue().
> Unexpected ConcurrentModificationException when altering Collection of a MultiValuedMap
> ---------------------------------------------------------------------------------------
>
> Key: COLLECTIONS-663
> URL: https://issues.apache.org/jira/browse/COLLECTIONS-663
> Project: Commons Collections
> Issue Type: Bug
> Reporter: Christophe Schmaltz
> Assignee: Bruno P. Kinoshita
> Priority: Trivial
>
> Testcase:
> {code} @Test
> public void test() {
> MultiValuedMap<Integer, Integer> multiMap = new HashSetValuedHashMap<>();
> multiMap.put(1, 10);
> multiMap.put(2, 20);
> for (Collection<Integer> innerCollection : multiMap.asMap().values()) {
> for (Iterator<Integer> iterator = innerCollection.iterator(); iterator.hasNext();) {
> Integer i = iterator.next();
> iterator.remove(); // only the innerCollection is altered
> }
> // innerCollection.add(6); // adding stuff back should also work...
> }
> }{code}
> This test unexpectedly throws a ConcurrentModificationException.
> The issue is that when calling {{iterator.remove()}} the {{AbstractMultiValuedMap.ValuesIterator}} detects that the Collection is empty and calls {{AbstractMultiValuedMap.this.remove(key);}}.
> It may be better if the iterator of the inner collection had a reference on the iterator if the outer map and called {{containerIterator.remove()}} instead.
> *Note:* this solution would again present issues if the user tries to add new elements in this now empty collection (which was removed from the parent).
> In the current state, it is quite unclear why an exception is thrown, without debugging the code.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)