下記のように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は5toArray
失敗するだけです 1 基本的に危険なことをしているあなたの症状。
複数のスレッドがリンクリストに同時にアクセスし、少なくとも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
.
実際にはいくつかの同期の障壁を設けて、それが起こらないようにする必要があります。