List、Set、Map都是线程不安全的
ArrayList
底层是数组,传的是一个Object泛型
初始值长度10,jdk8是空(采用懒加载机制)
扩容会变成10+10/2=15
ArrayList 是线程不安全的
- ArrayList的故障现象
- 导致原因
- 解决方法
- 优化建议
异常:
多个线程进行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
达到扩容条件则会按照原始的大小的一倍扩容
就会变成16+16*2=48
解决并发过程中线程不安全的方式是使用Map<String,String> map= new ConcurrentHashMap<>();
Set
set也是不安全的和List一样会报同样的错误
Set的底层是HashMap
key是泛型E
value是Object
解决多线程不安全的方式是使用Set set = new CopyOnWriteArraySet<>();