高并发情况下ArrayList,HashSet,HashMap线程不安全的解决办法
程序员文章站
2022-04-01 08:47:53
...
package com.atguigu.day01;
//java.util.ConcurrentModificationException
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
/**
- @auther zzyy
- @create 2020-03-28 7:51
- 出故障了,如何面对?
- 1 故障现象
- java.util.ConcurrentModificationException
- 2 导致原因
- 3 解决方法
- 集合ArrayList线程不安全解决方法
- 1.1 new Vector<>();
- 1.2 Collections.synchronizedList(new ArrayList<>());
- 1.3 juc—new CopyOnWriteArrayList<>();
- HashSet线程不安全解决方法
- 2.1 Collections.synchronizedSet(new HashSet<>());
- 2.2 juc—new CopyOnWriteArraySet<>();
- HashMap线程不安全解决方法
- 3.1new ConcurrentHashMap<>();
- 4 优化建议(同样的错误不犯第2次)
- 写时复制 ,同一个时间,有读取,也有写入。 读写分离的思想
*/
public class ArrayListDemo {
public static void main(String[] args) {
//Map<String, String> map = new HashMap<>(); 线程不安全的
Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i <30 ; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,6));
System.out.println(map);
},"线程"+i).start();
}
}
public void SetNoSafe(){
// Set<String> set = new HashSet<>(); 线程不安全的
// Set<String> set = Collections.synchronizedSet(new HashSet<>());
Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 0; i <30 ; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0,6));
System.out.println(Thread.currentThread().getName()+set);
},"线程"+i).start();
}
}
public void ListNoSafe(){
//List<String> list = new ArrayList<>(); 线程不安全的
//List<String> list = new Vector<>();
//List<String> list = Collections.synchronizedList(new ArrayList<>());
List<String> list = new CopyOnWriteArrayList<>();
for (int i = 0; i <30 ; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0,6));
System.out.println(Thread.currentThread().getName()+list);
},"线程"+i).start();
}
}
}
下一篇: python——用BP神经网络做预测