Java 将linkedList转换为数组列表时发生ArrayIndexOutOfBoundsException

Java 将linkedList转换为数组列表时发生ArrayIndexOutOfBoundsException,java,arraylist,linked-list,Java,Arraylist,Linked List,我正在尝试将linkedList转换为ArrayList,如下所示 private LinkedList<myData> myLinkedList= new LinkedList<myData>(); public Collection<myData> getData() { return new ArrayList<myData>(myLinkedList); } private LinkedList myLinkedLis

我正在尝试将linkedList转换为ArrayList,如下所示

private LinkedList<myData> myLinkedList= new LinkedList<myData>();  
public Collection<myData> getData()  
 {
  return new ArrayList<myData>(myLinkedList);  
 }
private LinkedList myLinkedList=new LinkedList();
公共集合getData()
{
返回新的ArrayList(myLinkedList);
}
linkedList可能由多个线程更新。在生产中进行测试时,我得到以下错误。这个错误是不一致的。所以我知道可能是一周一次,一个月左右

java.lang.ArrayIndexOutOfBoundsException: 15   
at java.util.LinkedList.toArray(LinkedList.java:866)   
at java.util.ArrayList.<init>(ArrayList.java:131)   
at org.xxx.yyy.zzz.getData(Data.java:291)  
java.lang.ArrayIndexOutOfBoundsException:15
位于java.util.LinkedList.toArray(LinkedList.java:866)
位于java.util.ArrayList。(ArrayList.java:131)
位于org.xxx.yyy.zzz.getData(Data.java:291)
有没有可能与linkedList的并发修改有关。谢谢你在这方面的帮助

LinkedList#toArray()就是这样实现的(Oracle JDK 7)

公共对象[]toArray(){
对象[]结果=新对象[大小];
int i=0;
for(节点x=first;x!=null;x=x.next)
结果[i++]=x项;
返回结果;
}
如果在构建
结果
数组之后但在
for
循环之前添加到
链接列表
,则当尝试访问大于原始
大小的索引时,
for
循环内的数组访问表达式将导致
ArrayIndexOutOfBoundsException


你真的应该设置一些同步障碍,这样就不会发生这种情况。

toArray
失败只是你做了一些根本危险的事情的一个症状

从:

如果多个线程同时访问一个链表,并且至少有一个线程在结构上修改链表,则必须在外部对其进行同步


您需要添加同步(不仅仅是为了
toArray
,基本上是为了列表的所有用途),或者使用一个设计为线程安全的并发集合。

是的。您可能应该在实例上进行同步。或者使用fail fast版本。如果有多个线程正在修改
链接列表
。。。对当它进行复制时,它分配一个数组,然后遍历列表。显然,您是在创建数组之后向列表中添加一个元素,而数组现在太小了。
public Object[] toArray() {
    Object[] result = new Object[size];
    int i = 0;
    for (Node<E> x = first; x != null; x = x.next)
        result[i++] = x.item;
    return result;
}