List、Set、Map都是线程不安全的

ArrayList

底层是数组,传的是一个Object泛型

初始值长度10,jdk8是空(采用懒加载机制)

扩容会变成10+10/2=15

ArrayList​ 是线程不安全的


  1. ArrayList的故障现象
  2. 导致原因
  3. 解决方法
  4. 优化建议


异常:
多个线程进行add可能会报​​java.util.ConcurrentModificationException​​异常
导致原因:
多个线程同时写入同一个位置
解决方法:
解决多线程并发写入异常使用
优化建议:
1.new Vector<>()
2.Collections.synchronizedList(new ArrayList<>());
3.new CopyOnWriteArrayList();
建议是呀new CopyOnWriteArrayList();


@Test
public void ttt(String[] args) {
List list = new CopyOnWriteArrayList();
for (int i = 0; i < 40; i++) {
new Thread(() -> {
list.add(UUID.randomUUID().toString().substring(0, 8));
System.out.println(list);
}, String.valueOf(i)).start();
}
}

HashMap

初始值16

达到扩容条件就会变成​​newCap = oldCap << 1​​也就是原来的2倍

解决并发过程中线程不安全的方式是使用​​Map<String,String> map= new ConcurrentHashMap<>();​

Set

set也是不安全的和List一样会报同样的错误

Set的底层是​​HashMap​

key是泛型E

value是Object

解决多线程不安全的方式是使用​​Set set = new CopyOnWriteArraySet<>();​