/ linkedListを配列リストに変換中に/ ArrayIndexOutOfBoundsExceptionが発生する - java、arraylist、linked-list

linkedListを配列リストに変換中のArrayIndexOutOfBoundsException - java、arraylist、linked-list

下記のようにlinkedListをArrayListに変換しようとしています。

private LinkedList<myData> myLinkedList= new LinkedList<myData>();
public Collection<myData> getData()
{
return new ArrayList<myData>(myLinkedList);
}

linkedListは複数のスレッドによって更新される可能性があります。実稼働中にテストしている間に、以下のエラーが発生します。エラーは一貫していません。だから私はそれが1週間に1回、1ヶ月かそこらになるかもしれないと思う

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の同時変更に関連する可能性がある方法はありますか。これに関するどんな助けでも感謝します。

回答:

回答№1は5

toArray 失敗するだけです 1 基本的に危険なことをしているあなたの症状。

から のドキュメンテーション LinkedList

複数のスレッドがリンクリストに同時にアクセスし、少なくとも1つのスレッドがリストを構造的に変更する場合は、 必須 外部で同期する

同期を追加する必要があるかもしれません。 toArrayしかし、基本的にすべてのリストの使用)または同時収集の1つを使用します。 設計 スレッドセーフです。


回答№2については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 オリジナルよりも大きいインデックスにアクセスしようとしたとき size.

実際にはいくつかの同期の障壁を設けて、それが起こらないようにする必要があります。