主要原因是ArrayList是非同步
的,没有同步机制
,并且其底层实现是基于数组
,而数组的长度是固定
的。当对 ArrayList 进行增删操作时,需要改变数组的长度,这就会导致多个线程可能同时操作同一个数组,从而引发线程安全问题。
具体来说,如果多个线程同时对 ArrayList 进行写操作(add、remove 等),可能会导致以下问题:
数据不一致:多个线程同时修改 ArrayList 的元素,可能会导致数据不一致的情况。例如,一个线程正在修改一个元素,而另一个线程正在读取该元素,这时就会出现数据不一致的情况。
索引越界:如果多个线程同时进行添加或删除元素操作,就可能导致索引越界的情况。例如,一个线程正在删除 ArrayList 中最后一个元素,而另一个线程正在向 ArrayList 中添加元素,这时就可能导致索引越界的情况。
/**
* 模拟ArrayList线程不安全
*/
public class UnsafeArrayList {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
//线程1,添加1000个元素
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
list.add(i);
}
});
//线程2,添加1000个元素
Thread t2 = new Thread(() -> {