Multithreading next set of insecurity

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();
        }
    }
    

 

Guess you like

Origin www.cnblogs.com/flgb/p/11768503.html