Hello all java.util.ServiceLoader does not seem to support usage of a second Iterator in the middle of a previous iteration. The attached Java file provides two simple tests with a ServiceLoader iterating over two elements. The first test creates two iterators and invokes their hasNext() / next() methods in the following order:
* Iterator 1 * Iterator 2 * Iterator 1 * Iterator 2 - unexpected end of iteration here. The second test creates two iterators and invoke the hasNext() methods on both iterators before to invoke their next() methods. This result is the following exception (tested on 1.8.0_31-b13): Exception in thread "main" java.util.ConcurrentModificationException at java.util.LinkedHashMap$LinkedHashIterator.nextNode(LinkedHashMap.java:711) at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:744) at java.util.LinkedHashMap$LinkedEntryIterator.next(LinkedHashMap.java:742) at java.util.ServiceLoader$1.next(ServiceLoader.java:479) at test.ServiceLoaderTest.test2(ServiceLoaderTest.java:47) at test.ServiceLoaderTest.main(ServiceLoaderTest.java:12) (note: to run the test, the attached test.ServiceLoaderTest file needs to be in the META-INF/services/ directory). I found a Stackoverflow thread mentioning this issue 4 years ago [1], but apparently without solution. Should I look for a patch, or is the current behaviour considered okay (in which case I would suggest to warn the users in the Javadoc)? Martin [1] http://stackoverflow.com/questions/2593777/serviceloader-double-iterator-issues
test.ServiceLoaderTest$I1 test.ServiceLoaderTest$I2