并发容器
list不安全
下列代码出现了并发修改异常 ConcurrentModificationException
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,5));
System.out.println(list);
},String.valueOf(i)).start();
}
}
解决方案
-
使用sync修饰的vector
-
使用Collections.synchronizedList()
-
使用并发容器**CopyOnWriteArrayList ** (Lock)
COW 写入时复制 计算机程序设计领域的一种优化策略
set不安全
同上
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,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
解决方案
- 使用Collections.synchronizedList()
- 使用CopyOnWriteSet
HashMap不安全
public static void main(String[] args) {
HashMap<String,String> map = new HashMap();
for(int i = 1;i <= 10;i++){
new Thread(()->{
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
解决方法
-
Collections工具
-
ConcurrentHashMap
内部有16个分段锁,每个锁上的桶单独操作