arraylist多线程错误类型及分析

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],此时就会抛出数据越界错误。

在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值