一、常规的Map集合并发下不安全
上代码:
public class TestMap {
public static void main(String[] args) {
//创建一个Map集合
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
控制台报错:
并发修改异常
二、解决方案
方案1:所有集合的顶部有一个Collections工具类,里面有给普通Map集合上锁的方法
public class TestMap {
public static void main(String[] args) {
//创建一个Map集合
Map<String, Object> map = Collections.synchronizedMap(new HashMap<>());
for (int i = 0; i < 30; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
方案2:通过JUC提供的一个ConcurrentHashMap类,来实现并发线程安全
public class TestMap {
public static void main(String[] args) {
//创建一个Map集合
Map<String, Object> map = new ConcurrentHashMap<>();
for (int i = 0; i < 30; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
控制台打印结果: