java多线程访问导致list访问越界报错

图片说明

public class Main {
    public static void main(String[] args) {

        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < 10000; i++) {
            list.add(1);

            new Thread(() -> {
                list.remove(0);
            }).start();
        }
    }
}

搞不懂为什么会样子,按理说没创建一个线程之前已经加上1了呀。即使夸张一点儿创建了10个线程,这十个线程还没来得及执行,但是下一次执行循环的时候,也已经add了11个1了呀?

改成用迭代器删除,list在做批量或者多次删除的时候需要用迭代器,ArrayList循环删除还可以从末端开始删除。否则会出现由于位置、长度重算造成的异常

new Thread(() -> {
    Iterator<Integer> iterator = list.iterator();
        if(iterator.hasNext()) {
            iterator.next();
            iterator.remove();
        }
}).start();

for (int i = 0; i < 10000; i++)改成for (int i = 1000; i >= 0; i--)

你写的循环是可以到头的,到头了就没得移除了,电脑的计算速度1000次还不是一眨眼的事