当前位置:   article > 正文

ArrayList、vector和linkedlist的区别以及Arraylist非线程安全的原因_linkedlist和arraylist是线程不安全的嘛?

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);    
    }    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

从源码中 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对象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/322019
推荐阅读
相关标签
  

闽ICP备14008679号