ArrayList、HashSet、HashMap是我们常用的三个集合,但是如果同一个集合对象被多个线程调用时,很容易出现
Java.util.ConcurrentModificationException并发修改异常
一、解决ArrayList并发问题
有如下解决方案
| Vector | Collections.synchronizedList() | CopyOnWriteArrayList() | |
|---|---|---|---|
| 原理 | synchronized | synchronized | Lock |
| 相对性能 | 低 | 低 | 高 |
public static void main(String[] args) {
/**
* List<String> list = new ArrayList<>(); 不安全
* 【解决方案】
* 1、List<String> list = Collections.synchronizedList(new ArrayList<>());
* 2、List<String> list = new Vector<>();
* 3、List<String> list = new CopyOnWriteArrayList<>();
*/
List<String> list = new CopyOnWriteArrayList<>();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(list);
}).start();
}
}
二、解决HashSet并发问题
有如下解决方案
| Collections.synchronizedSet() | CopyOnWriteArraySet() | |
|---|---|---|
| 原理 | synchronized | Lock |
| 相对性能 | 低 | 高 |
public static void main(String[] args) {
/**
* Set<String> set = new HashSet<>(); 不安全
* 【解决方案】
* 1、Set<String> set = Collections.synchronizedSet(new HashSet<>());
* 2、Set<String> set = new CopyOnWriteArraySet<>();
*/
Set<String> set = new CopyOnWriteArraySet<>();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(set);
}).start();
}
}
三、解决HashMap并发问题
有如下解决方案
| HashTable | Collections.synchronizedMap() | ConcurrentHashMap() | |
|---|---|---|---|
| 原理 | synchronized | synchronized | Lock |
| 相对性能 | 低 | 低 | 高 |
public static void main(String[] args) {
/**
* Map<String> map = new HashMap<>(); 不安全
* 【解决方案】
* 1、
* 2、Map<String, String> map = Collections.synchronizedMap(new HashMap<>());
* 3、Map<String, String> set = new ConcurrentHashMap<>();
*/
Map<String, String> map = new ConcurrentHashMap<>();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
}).start();
}
}
好啦,以上!