集合
CopyOnWriteArrayList(线程安全)
集合类不安全
List不安全
先看一段代码:
public class ListTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
for (int i=0;i<=100;i++){
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
运行时有结果,但报错了:java.util.ConcurrentModificationException
:并发修改异常
解决方案一:
List里面有一个Vector是线程安全的
* 并发下ArrayList不安全
* 解决方案:
* 1、List<String> list = new Vector<>();(JDK1.0就有了,ArrayList在JDK1.2才有的)
* 2、ArrayList不安全那就使用工具类把它变安全:Collections.synchronizedList(new ArrayList<>());
* 3、List<String> list = new CopyOnWriteArrayList();java.util.concurrent.CopyOnWriteArrayList;
* CopyOnWrite:写入时复制,COW
* 多线程调用时;同时调用list,读取时固定,写入时覆盖
set不安全
public class SetTest {
public static void main(String[] args) {
/**
* HashSet<>()不安全,多个线程存在ConcurrentModificationException:并发修改异常
* 解决方案:1、工具类把它变安全:Collections.synchronizedSet(new HashSet<>());
* 2、CopyOnWriteArraySet
*/
/*Set<String> set = new HashSet<>();*/
/* Set<String> set = Collections.synchronizedSet(new HashSet<>());*/
Set<String> set = new CopyOnWriteArraySet<>();
for (int i=0;i<=100;i++){
new Thread(()->{
set.add(UUID.randomUUID().toString().substring(0,5));
System.out.println(set);
},String.valueOf(i)).start();
}
}
}
HashSet的底层就是hashMap
public HashSet() {
map = new HashMap<>();
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
Map不安全
HashMap底层:new HashMap<>()==>new HashMap<>(16,0.75)
ublic class MapTest {
public static void main(String[] args) {
/**
* Map默认等于
* HashMap<>()不安全,多个线程存在ConcurrentModificationException:并发修改异常
* 解决方案:1、工具类把它变安全:Collections.synchronizedSet(new HashSet<>());
* 2、ConcurrentHashMap
*/
/*Map<String,String> map = new HashMap<>();*/
/*Map<String,String> map = Collections.synchronizedMap(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,5));
System.out.println(map);
},String.valueOf(i)).start();
}
}
}
上一篇:JUC详解3——8锁问题
下一篇:JUC详解5——常用辅助类