2016-06-17 7 views
4

安全な私はList<int[]>持っていると私はこのように試してみましたint[][]のJava変換リストは[] int型[]の配列に - 同時

に変換したいと思います:

 private List<int[]> pos = new LinkedList<>(); 
     ... 
     public int[][] getPos() { 
     int[][] ret = new int[pos.size()][2]; 
     int i = 0; 
     for (Object o : pos) { 
      ret[i] = Arrays.stream((int[]) o).toArray(); 
      i++; 
     } 
     return ret; 
     } 

私の場合の大きな問題は、他のスレッドが変換中にリストを変更していることです。だから私はforeachの上にConcurrentModificationExceptionを得ます。

Streamsのようにこれを行う他の方法はありますか?それは安全です。

よろしく

+0

事前にリストのローカルコピーを作成してください。これはスレッドを使用する方法です。 – grochmal

+2

同期またはロックを考慮してください。 –

答えて

2

よりよい解決策は、ConcurrentQueueを使用することです。これは、あなたがそれらを消費している間に値を加えることができるということでした。注:コピーを完了した後で、int[]をコピーすることはできません。

+0

クイックフィックスのために魅力的に働いた。しかし、私はさらにロック/同期を見ていきます。 –

3

LinkedListロック/同期を使用せずに、あなたのプログラムスレッドを安全にすることはできませんので、スレッドセーフではありません。

CopyOnWriteArrayListこれは簡単ですが、他のスレッドが書き込む間にそれを安全に反復することができます(ただし、foreach/iteratorを開始したときのリスト状態のみをコピーします。Listへの変更は反映されません)。別のforeach/iterator)。

関連する問題