On 17/06/2009, joe...@apache.org <joe...@apache.org> wrote: > Author: joehni > Date: Wed Jun 17 22:28:09 2009 > New Revision: 785844 > > URL: http://svn.apache.org/viewvc?rev=785844&view=rev > Log: > Removing entries with the MapIterator may also result in a > ConcurrentModificationException (COLLECTIONS-330). > > Modified: > > commons/proper/collections/trunk/src/test/org/apache/commons/collections/map/TestLRUMap.java > > Modified: > commons/proper/collections/trunk/src/test/org/apache/commons/collections/map/TestLRUMap.java > URL: > http://svn.apache.org/viewvc/commons/proper/collections/trunk/src/test/org/apache/commons/collections/map/TestLRUMap.java?rev=785844&r1=785843&r2=785844&view=diff > > ============================================================================== > --- > commons/proper/collections/trunk/src/test/org/apache/commons/collections/map/TestLRUMap.java > (original) > +++ > commons/proper/collections/trunk/src/test/org/apache/commons/collections/map/TestLRUMap.java > Wed Jun 17 22:28:09 2009 > @@ -26,6 +26,7 @@ > import junit.textui.TestRunner; > > import org.apache.commons.collections.BulkTest; > +import org.apache.commons.collections.MapIterator; > import org.apache.commons.collections.OrderedMap; > import org.apache.commons.collections.ResettableIterator; > > @@ -455,6 +456,87 @@ > } catch (IndexOutOfBoundsException ex) {} > } > > + // TODO: COLLECTIONS-330 > + public void todoTestSynchronizedRemoveFromMapIterator() throws > InterruptedException { > + > + final LRUMap map = new LRUMap(10000); > + > + final Map exceptions = new HashMap(); > + final ThreadGroup tg = new ThreadGroup(getName()) { > + public void uncaughtException(Thread t, Throwable e) { > + exceptions.put(e, t.getName()); > + super.uncaughtException(t, e); > + } > + }; > + > + final int[] counter = new int[1]; > + counter[0] = 0; > + final Thread[] threads = new Thread[50]; > + for (int i = 0; i < threads.length; ++i) { > + threads[i] = new Thread(tg, "JUnit Thread " + i) { > + > + public void run() { > + int i = 0; > + try { > + synchronized (this) { > + notifyAll(); > + wait(); > + } > + Thread thread = Thread.currentThread(); > + while (i < 1000 && !interrupted()) { > + synchronized (map) { > + map.put(thread.getName() + "[" + ++i + "]", > thread); > + } > + } > + synchronized (map) { > + for (MapIterator iter = map.mapIterator(); > iter.hasNext();) {
Surely there is a missing iter.next() here? I tried adding it, and the test passes - i.e. the failure is nothing to do with the remove() > + if (map.get(iter.getValue()) == this) { > + iter.remove(); > + } > + } > + } > + } catch (InterruptedException e) { > + fail("Unexpected InterruptedException"); > + } > + if (i > 0) { > + synchronized (counter) { > + counter[0]++; > + } > + } > + } > + > + }; > + } > + > + for (int i = 0; i < threads.length; ++i) { > + synchronized (threads[i]) { > + threads[i].start(); > + threads[i].wait(); > + } > + } > + > + for (int i = 0; i < threads.length; ++i) { > + synchronized (threads[i]) { > + threads[i].notifyAll(); > + } > + } > + > + Thread.sleep(1000); > + > + for (int i = 0; i < threads.length; ++i) { > + threads[i].interrupt(); > + } > + for (int i = 0; i < threads.length; ++i) { > + synchronized (threads[i]) { > + threads[i].join(); > + } > + } > + > + assertEquals("Exceptions have been thrown: " + exceptions, 0, > exceptions.size()); > + assertTrue("Each thread should have put at least 1 element into the > map, but only " > + + counter[0] + " did succeed", counter[0] >= > threads.length); > + } > + > public void testSynchronizedRemoveFromEntrySet() throws > InterruptedException { > > final Map map = new LRUMap(10000); > @@ -536,7 +618,7 @@ > + counter[0] + " did succeed", counter[0] >= threads.length); > } > > - // TODO: COLLECTIONS-3 > + // TODO: COLLECTIONS-330 > public void todoTestSynchronizedRemoveFromKeySet() throws > InterruptedException { > > final Map map = new LRUMap(10000); > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org