List
public class ListTest {
public static void main(String[] args) {
/*
* 解决方案:
* 1.用Vector
* 2.List<String> list=Collections.synchronizedList(new ArrayList<>());不安全转安全
* 3.juc方案:List<String> list = new CopyOnWriteArrayList<>();
* CopyOnWrite:写入时复制,COW 计算机程序设计领域的一种优化策略
* 多个线程调用的时候,list,读取的时候,固定的,写入(覆盖)
* 在写入的时候避免覆盖,造成数据问题
* CopyOnWrite比Vector优势:Vector synchronized修饰(效率低),CopyOnWrite,复制,再set,用的juc的锁
* */
List<String> list = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(list);
}, String.valueOf(i)).start();
}
}
}
Set
//java.util.ConcurrentModificationException
public class SetTest {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
/*
* 解决:
* 1.Collections.synchronizedSet(new HashSet<>());
* 2.Set<Object> set = new CopyOnWriteArraySet<>();
* */
for (int i = 1; i <= 5000; i++) {
new Thread(() -> {
set.add(UUID.randomUUID().toString().substring(0, 5));
System.out.println(set);
}, String.valueOf(i)).start();
}
}
}
Set底层
public HashSet() {
map = new HashMap<>();
}
//add set本质就是map中的key,不可重复
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
//不变的值
private static final Object PRESENT = new Object();
Map
//java.util.ConcurrentModificationException
public class MapTest {
public static void main(String[] args) {
/*Map<String, Object> map = new HashMap<>();
* 默认值:初始化容量:16
* 加载因子:0.75f
* */
/*
* 1.使用HashTable
* 2.Map<String, Object> map=Collections.synchronizedMap(new HashMap<>());
* 3.Map<String, Object> map=new ConcurrentHashMap<>();
* */
Map<String, Object> map = new HashMap<>();
for (int i = 1; i <= 50; i++) {
new Thread(() -> {
map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0, 5));
System.out.println(map);
}, String.valueOf(i)).start();
}
}
}