场景

集合类不安全的问题



问题

并发修改异常

package arraylist4;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
* 集合类不安全的问题
* ArrayList
*/
public class ContainerNotSafeDemo {
public static void main(String[] args) {
// List<String> list= Arrays.asList("a","b","c");
// list.forEach(System.out::println);
List<String> list=new ArrayList<>();
// list.add("a");
// list.add("b");
// list.add("c");
//
// for (String element:list) {
// System.out.println(element);
// }

//forthread10
for (int i = 1; i <= 30; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},String.valueOf(i)).start();
}
//java.util.ConcurrentModificationException


}
}

解决方案

package arraylist4;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
* 集合类不安全的问题
* ArrayList
*/
public class ContainerNotSafeDemo {
public static void main(String[] args) {

List<String> list=new CopyOnWriteArrayList<>();

for (int i = 1; i <= 30; i++) {
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},String.valueOf(i)).start();
}
//java.util.ConcurrentModificationException

/*
* 1 故障现象
* java.util.ConcurrentModificationException
* 2 导致原因
*
* 3 解决方案
* 3.1 List<String> list=new Vector<>();
* 3.2 List<String> list=Collections.synchronizedList(new ArrayList<>());
* 3.3 List<String> list=new CopyOnWriteArrayList<>();
*
* 4 优化建议(同样的错误不犯第2次)
*/

}
}