场景
集合类不安全的问题
推荐
第二季:4我们知道ArrayList是线程不安全,请编码写一个不安全的案例并给出解决方案。【Java面试题】
问题
并发修改异常
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次) */ } }