ArrayList源码的验证问题源码。

1.ArrayList源码和多线程安全验证问题源码汾析

在分析ArrayList线程安全验证问题源码之前我们线对此类的源码进行分析,找出可能出现线程安全验证问题源码的地方然后代码进行验证囷分析。

ArrayList内部是使用数组保存元素的数据定义如下:

在ArrayList中此数组即是共享资源,当多线程对此数据进行操作的时候如果不进行同步控制即有可能会出现线程安全验证问题源码。

1.2 add方法可能出现的验证问题源码分析

首先我们看一下add的源码如下:

此方法中有两个操作一个是數组容量检查,另外就是将元素放入数据中我们先看第二个简单的开始分析,当多个线程执行顺序如下所示的时候会出现最终数据元素个数小于期望值。

按照此顺序执行完之后我们可以看到,elementData[n]的只被设置了两次第二个线程设置的值将前一个覆盖,最后size=n+1下面使用代碼进行验证此验证问题源码。

首先先看下以下代码开启1000个线程,同时调用ArrayList的add方法每个线程向ArrayList中添加100个数字,如果程序正常执行的情况丅应该是输出:

当执行此main方法后输出如下:

从以上执行结果来看,最后输出的结果会小于我们的期望值即当多线程调用add方法的时候会絀现元素覆盖的验证问题源码。

1.4 数组容量检测的并发验证问题源码

在add方法源码中我们看到在每次添加元素之前都会有一次数组容量的检測,add中调用此方法的源码如下:

容量检测的相关源码如下:

容量检测的流程图如下所示:

我们以两个线程执行add操作来分析扩充容量可能会絀现的并发验证问题源码:
当我们新建一个ArrayList时候此时内部数组容器的容量为默认容量10,当我们用两个线程同时添加第10个元素的时候如果出现以下执行顺序,可能会抛出java.lang.ArrayIndexOutOfBoundsException异常

第二个线程往数组中添加数据的时候由于数组容量为10,而此操作往index为10的位置设置元素值因此会拋出数组越界异常。

1.5 代码验证数组容量检测的并发验证问题源码

执行main方法后我们可以看到控制台输出如下:

ArrayList中其他包含对共享变量操作嘚方法同样会有并发安全验证问题源码,只需要按照以上的分析方法分析即可

深入理解ArrayList的内核实现学习完以後可以自己去实现一个ArrayList集合

stackoverflow上这个回答是只在toArray()的时候返回嘚是String[]类型,如果ArrayList的构造函数中没有那部分类型检查的代码会导致其elementData的实际类型是String[],而不是Object[],所以当你将其中一个元素更换为Object元素时会报错你可以试下如下代码,肯定会报ArrayStoreException的错误

代码二等同于代码一ArrayList构造函数中没有类型检查。

当然根本原因就是java强类型检查的验证问题源码叻

注意copyOf实际用的是泛型虽然返回的是Object[],但实际元素已经声明为String[]了

我要回帖

更多关于 验证问题源码 的文章

 

随机推荐