将linkedList转换为数组列表时出现ArrayIndexOutOfBoundsException

时间:2014-01-06 06:07:19

标签: java arraylist linked-list

我试图将linkedList转换为ArrayList,如下所示。

private LinkedList<myData> myLinkedList= new LinkedList<myData>();  
public Collection<myData> getData()  
 {
  return new ArrayList<myData>(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)  

是否有任何方法可以与linkedList的并发修改相关。感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

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

来自documentation of LinkedList

  

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

您需要添加同步(不仅适用于toArray,而且基本上都是列表的所有用途)或使用其中一个设计的并发集合作为线程 - 安全

答案 1 :(得分:2)

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

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;
}

如果在构造LinkedList数组之后但在result循环之前添加for,那么for循环内的数组访问表达式将导致{尝试访问大于原始ArrayIndexOutOfBoundsException的索引时{1}}。

你应该真正设置一些同步障碍,以免发生。