看代码,我这里是用的不安全集合 ArrayList,然后我再遍历添加元素,在遍历中输出集合。
package collection;
import java.util.ArrayList;
import java.util.UUID;
public class SafeCollection {
public static void main(String[] args) {
ArrayList<Object> list = new ArrayList<>();
for (int i = 1; i <=100 ; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list.toString());
}).start();
}
}
}
Exception in thread "Thread-45" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at java.util.AbstractCollection.toString(AbstractCollection.java:461)
at collection.SafeCollection.lambda$main$0(SafeCollection.java:14)
at java.lang.Thread.run(Thread.java:748)
[3705d, b143c, 06111, db9a2, 185fe, 107db, fd53b, 366fd, 832da, d14a7, c5d20, 86a40, 65068, 34cd1, 781ca, 4cba6, 4b731, 94945, 22bda, 88574,
此时就会出现ConcurrentModificationException,这是因为多线程情况下,当线程a扩容了集合,然后要在扩容处添加新的元素时,线程b遍历了集合,此时就会出现错误ConcurrentModificationException。