arraylist线程不安全例子
时间: 2023-05-26 09:05:12 浏览: 69
以下是一个关于ArrayList线程不安全的例子:
假设有两个线程同时对一个ArrayList进行操作,线程1要向ArrayList中添加元素,线程2要删除ArrayList中的元素。代码如下:
```
import java.util.ArrayList;
public class ArrayListThreadUnsafe {
public static void main(String[] args) throws InterruptedException {
ArrayList<Integer> list = new ArrayList<Integer>();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(1);
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
list.remove(0);
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(list);
}
}
```
在上面的例子中,线程1将要在1秒后向ArrayList中添加一个元素,线程2会尝试删除ArrayList中的第一个元素。由于ArrayList不是线程安全的,当线程1和线程2同时对ArrayList进行操作时,就可能会出现意想不到的结果。具体表现为:输出的list中可能只有1,也可能是空的,或者出现异常。
这是由于线程1和线程2可能同时修改了同一个位置的元素,导致其中一个操作失败或者产生异常。要解决这个问题,可以使用线程安全的集合,例如使用CopyOnWriteArrayList来代替ArrayList。