java_集合不安全
1、ArrayList
/** * 集合类不安全问题 * 1、故障现象: * java.util.ConcurrentModificationException(并发修改异常) * 2、解决方案 * 3.1、new Vector<>(); * 3.2、Collections.synchronizedList(new ArrayList<>()); * 3.3、new CopyOnWriteArrayList<>();//写时复制 */ public class ContainerNotSafeDemo { public static void main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 1; i <= 10; i++) { new Thread(() ->{ list.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(list); },String.valueOf(i)).start(); } } }
ArrayList之线程不安全解决方式1:使用线程安全的集合,例如Vector、Stack
List<String> list = new Vector<>();
ArrayList之线程不安全解决方式2:
使用Collections类
List<String> list = Collections.synchronizedList(new ArrayList<>());
ArrayList之线程不安全解决方式3:
写时拷贝技术
List<String> list = new CopyOnWriteArrayList<>();
2、HashSet
public static void main(String[] args) { Set<String> set = new HashSet<>(); for (int i = 1; i <= 30; i++) { new Thread(() ->{ set.add(UUID.randomUUID().toString().substring(0,8)); System.out.println(set); },String.valueOf(i)).start(); } }
HashSet之线程不安全解决方式1:
Set<String> set = Collections.synchronizedSet(new HashSet<>());
HashSet之线程不安全解决方式2:
Set<String> set = new CopyOnWriteArraySet<>();
3、HashMap
public static void main(String[] args) { Map<String,String> map = new HashMap<>(); for (int i = 1; i <= 30; i++) { new Thread(() ->{ map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,8)); System.out.println(map); },String.valueOf(i)).start(); } }
HashMap之线程不安全解决方式1:使用线程安全的集合,例如Hashtable
HashMap之线程不安全解决方式2:
Map<String,String> map = Collections.synchronizedMap(new HashMap<>());
HashMap之线程不安全解决方式3:
Map<String,String> map = new ConcurrentHashMap<>();