ArrayList、vector和linkedlist的区别以及Arraylist非线程安全的原因

ArrayList、vector和linkedlist的区别
在这里插入图片描述
ArrayList非线程安全的原因:

public boolean add(E e) {    
    ensureCapacity(size + 1); 
    elementData[size++] = e;    
    return true;    
}    

public void ensureCapacity(int minCapacity) {    
    modCount++;    
    int oldCapacity = elementData.length;        
    if (minCapacity > oldCapacity) {    
        Object oldData[] = elementData;    
        int newCapacity = (oldCapacity * 3)/2 + 1;    
        if (newCapacity < minCapacity)    
            newCapacity = minCapacity;    
        elementData = Arrays.copyOf(elementData, newCapacity);    
    }    
}

从源码中 elementData[size++] = e; 这个方法,首先这个方法不是一个原子操作,所以不能保证多线程环境安全,这个可以拆分为两步:
a、 elementData[size] = e; b、 size++;
在Thread1执行elementData[size]=e时,cpu暂停对Thread1的执行,来执行Thread2,此时size还没加一,Thread2执行a、b两步的时候就会覆盖Thread1对elementData[size]的赋值,然后Thread1、Thread2都执行size++操作。

既然ArrayList是线程不安全的,但如果需要在多线程中使用,可以采用list list =Collections.synchronizedList(new ArrayList)来创建一个ArrayList对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值