ArrayList线程不安全的体现原理

我们从学习集合时就知道Arraylist线程不安全,但是它到底怎么线程不安全呢?
从源码中我们看到add方法

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

判断列表的capacity容量是否足够,是否需要扩容,将元素添加进列表的元素数组里面。
使用多线程操作ArrayList会发现
在这里插入图片描述
ArrayList线程不安全的体现原理_第1张图片
这就很好的体现了其为什么线程不安全了
示例代码

package com.xql.ThradArrayList;

import java.util.ArrayList;
import java.util.List;

public class ThreadArraylist {
    public static void main(String[] args) throws InterruptedException {
        final List list = new ArrayList<>();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int x = 0; x < 1000;x++){
                    list.add(x);
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int x =1001;x < 2000;x++){
                    list.add(x);
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        Thread.sleep(1000);
        for (int x=0;x < list.size();x++){
            System.out.println("第" + (x + 1) + "个元素为:" + list.get(x));
        }
    }
}

学艺不 精 望各位多多理解

你可能感兴趣的:(java)