1.数出现null值
赋值语句
elementData[size] = e;
size ++;
1.出现null
先对数组赋值,然后size++,
如果先对array的某一位置进行赋值,size++尚未执行,另一项程开始对此位置赋值,然后执行size++,之后,此线程执行size++,相当于size跳空一位,此位置并没有赋值,就会出现null值.结束后,下一次赋值从size+2,开始.
假设初始size为0,elementData为空。
当线程A执行完elementData[size] = e;还未执行size++就停止了,此时,size=0; elementData[0]放的是A的value,
然后线程B正常完成一个add操作;此时size=1,elementData[0]里面放的是B的value,把A的value给覆盖了。
2.出现数组缺位
由于size++是先把操作数 取出来,放在操作数栈中在写回去,
如果A线程取到一个size值为x,放在操作数栈中已经自增1,B线程开始执行,取到size值也为x,放在操作数栈中,自增为1,写回去x+1,A线程开始写回去,也是x+1,就会出现size++运行两次但增1.
3.越界
假设初始化size为9,elementData.length也为10,这里处于要扩容的临界点。
当线程A执行完代码1(ensureCapacityInternal(size + 1)),后暂停了。此时未扩容。
然后线程B也执行代码1(ensureCapacityInternal(size + 1)),也没有扩容,然后继续往后正常执行。此时size变为了10了。
然后线程A继续执行代码2,size先变为11,然后在赋值给elementData[10],此时就会抛出数据越界错误。