java线程安全集合操作
2022-12-14 本文已影响0人
arkliu
CopyOnWriteArrayList
// 并发下ArrayList是不安全的
List<String> lst = new ArrayList<>();
// java.util.ConcurrentModificationException 并发修改异常
for (int i = 1; i <= 10; i++) {
new Thread(()->{
lst.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(lst);
}, String.valueOf(i)).start();
}
解决方案:
1. 使用vector, vector是线程安全的
List<String> lst = new Vector();
2. 使用Collections.synchronizedList
List<String> lst = Collections.synchronizedList(new ArrayList<>());
3. 使用CopyOnWriteArrayList 写入时复制
List<String> lst = new CopyOnWriteArrayList<>();
CopyOnWriteArraySet
Set<String> set = new HashSet<>();
// java.util.ConcurrentModificationException 并发修改异常
for (int i = 1; i <= 10; i++) {
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(set);
}, String.valueOf(i)).start();
}
解决方案:
1. 使用Collections.synchronizedSet
Set<String> set = Collections.synchronizedSet(new HashSet<>());
2. 使用CopyOnWriteArraySet
Set<String> set = new CopyOnWriteArraySet<>();
ConcurrentHashMap
Map<String, String>map = new HashMap<>();
// java.util.ConcurrentModificationException 并发修改异常
for (int i = 1; i <= 20; i++) {
new Thread(()->{
map.put(Thread.currentThread().getName(),UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
}, String.valueOf(i)).start();
}
解决方案:
1.. 使用ConcurrentHashMap
Map<String, String>map = new ConcurrentHashMap();