我试图将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的并发修改相关。感谢任何帮助。
答案 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}}。
你应该真正设置一些同步障碍,以免发生。