ArrayList线程不安全
public class ArrayListTest {
public static void main(String[] args)throws Exception{
// 报并发修改异常的ArrayList
List<Integer> list = new ArrayList<>();
// 方法一,
// List<Integer> list = new Vector<>();
// 方法二
// List<Integer> list = Collections.synchronizedList(new ArrayList<>());
// 方法三
// List<Integer> list = new CopyOnWriteArrayList<>();
Random random = new Random();
for (int i = 0; i < 50; i++){
new Thread(() ->{
list.add(random.nextInt(10));
System.out.println(list);
},String.valueOf(i)).start();
}
}
}
代码会报并发修改异常(java.util.ConcurrentModificationException)
这是因为多线程争抢修改导致。
解决方案
1.使用new Vector<>()
替代new ArrayList<>()
;因为Vector是加了synchronized
,可以保证线程间的同步性。
2.使用辅助工具类Collections.synchronizedList()
。同理,可以对Set类使用Collections.synchronizedSet()
,对Map类使用Collections.synchronizedMap()
解决相同的问题。
3.使用写时复制new CopyOnWriteArrayList<>()
。这样在读多写少时,很好的提高了并发效率。