List集合线程不安全
Exception in thread "64" java.util.ConcurrentModificationException
/**
*List集合线程不安全
*/
public class ThreadDemo4 {
public static void main(String[] args) {
//创建ArrayList集合
List<String> list = new ArrayList<>();
for (int i= 0;i<100;i++){
new Thread(()->{
list.add(UUID.randomUUID().toString().substring(0,8));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
运行结果:
查看ArrayList 添加方法源码
/** * Appends the specified element to the end of this list. * * @param e element to be appended to this list * @return <tt>true</tt> (as specified by {@link Collection#add}) */ public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
没有synchronized,所以是线程不安全
解决方案3种
第一种 Vector
List<String> list = new Vector<>();
第二种 Collections解决
List<String> list = Collections.synchronizedList(new ArrayList<>());
第三种CopyOnWriteArrayList写时复制技术
List<String> list = new CopyOnWriteArrayList<>();
HashSet线程不安全
解决方案
Set<String> set = new CopyOnWriteArraySet<>();
HashMap线程不安全
解决方案
Map<String,String> set = new ConcurrentHashMap<>();