public class CollectionDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); for (int i = 1; i < 40; i++) { new Thread(() -> { list.add(UUID.randomUUID().toString().substring(0, 8)); System.out.println(list); }, "线程" + String.valueOf(i)).start(); } //list.forEach(System.out::println); } }
Result: instead of printing out the three parameters, abnormal
Exception in thread "线程6" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) at java.util.AbstractCollection.toString(Unknown Source) at java.lang.String.valueOf(Unknown Source) at java.io.PrintStream.println(Unknown Source) at com.shangguigu.collection.CollectionDemo.lambda$0(CollectionDemo.java:14) at java.lang.Thread.run(Unknown Source)
Modified set of security
// the ArrayList properties, initialization default size 10, each half of the expansion, 15,22 // first getArray (), size () +. 1, copyOf () public static void main (String [] args) { List<String> list = Collections.synchronizedList(new ArrayList<String>()); for (int i = 1; i < 40; i++) { new Thread(() -> { list.add(UUID.randomUUID().toString().substring(0, 8)); System.out.println(list); }, "线程" + String.valueOf(i)).start(); } //list.forEach(System.out::println); }
public static void main(String[] args) { List List = <String> new new a CopyOnWriteArrayList < > (); // ReentrantLock bottom, first copy to change finished, a pointer re-point to the new array for ( int I = . 1 ; I < 40 ; I ++ ) { new new the Thread (() -> { list.add(UUID.randomUUID().toString().substring(0, 8)); System.out.println(list); }, "线程" + String.valueOf(i)).start(); } //list.forEach(System.out::println); }
hashSet and HashMap, too
public static void main(String[] args) { //listdemo(); setdemo(); mapdemo (); } /** * HashMap initial value of 16, doubling every expansion */ private static void mapdemo() { Map<String,String> map = new ConcurrentHashMap<>();//Collections.synchronizedSet(new HashMap<>()); for (int i = 1; i < 40; i++) { new Thread(() -> { map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0, 8)); System.out.println(map); }, "线程" + String.valueOf(i)).start(); } } private static void setdemo() { Set<String> set = new CopyOnWriteArraySet<>();//Collections.synchronizedSet(new HashSet<>()); for (int i = 1; i < 40; i++) { new Thread(() -> { set.add(UUID.randomUUID().toString().substring(0, 8)); System.out.println(set); }, "线程" + String.valueOf(i)).start(); } }