2016-08-06 22 views
0

ArrayListを使用してオブジェクトを順番に格納しています(各オブジェクトは整数形式で一意のIDを持ちます)。 ID。だから私は、Iteratorが、私が理解する限り線形的にリストにアクセスするための方法ではなく、検索のサイズと頻度を考慮して、これは実行可能ではないと判断しました。同期リストの削除(バイナリ検索)と反復処理

これはマルチスレッド環境であり、別のスレッドが内容を変更(削除または追加)したいときに、リストが(順序どおりに)反復される可能性があることです。私は、同期化されたアプローチを使用しようとしましたが、次の状況が今でもConcurrentModificationExceptionを引き起こしていることがわかりました。

ArrayList<Object> list = new ArrayList<>(); 

public synchronized void removeFromList(int index) 
{ 
    list.remove(index); 
} 

public synchronized void addToList(Object o) 
{ 
    list.add(o); 
} 

public synchronized int findByID(int ID) 
{ 
    //search for item in list 
} 

public void paint(Graphics g) 
{ 
    synchronized(list) 
    { 
     for(Object o : list) 
     { 
      o.render(g); 
     } 
    } 
} 

実際に塗装する方法はSwingのものです。私の最終的な実装ではSwingは関係しませんが、これは有用なテスト環境です。私は後の実装のためにマルチスレッドソリューションが必要になります。

同期についての私の理解にスポットが当てられているかどうかはわかりませんが、私は最後の数日間、それを一緒にまとめようと必死にしています。誰にも私の直近の問題を解決する方法や、より深いリソースへのリンク(小さな小説のサイズはすごいです!)を教えてください。

答えて

4

同期について:​​メソッドがあり、 オブジェクトを含むリストを同期します。 void synchronized method()だからあなたは、内側listインスタンスを外部クラスのインスタンスを同期してない

void method() { 
    synchronized(this) { 
    // ... 
    } 
} 

に相当します。私はあなたの例外を引き起こしていると思います。

+0

ああ、そのシグネチャがその内部のリソースではなく、これを同期させることになることは間違いありませんでした。大変ありがとうございました!私は、改訂されたコードでいくつかのテストを行い、まだ例外が発生するかどうかを確認します。 – Stevo

+0

テストの後、私はConcurrentModificationExceptionを新しいコードと共に表示することができませんでした。しかし、私が持っていたものに戻って例外を持ち出すので、情報に非常に感謝します、それはトリックでした! – Stevo

+0

あなたは大歓迎です:) – hfhc2

3

IDで注文するコレクションをIDで高速にアクセスするには、TreeMapが最適です。

更新中にリストを反復処理できる同時アクセスも必要な場合は、ConcurrentSkipListMapが最適です。

この方法では、何も同期する必要はありません。

+0

リストの使用方法を考慮すると、ArrayListが提供する定数アクセスが理想的です。同期権を取得できるかどうか。同期を正しく使う方法を学ぶ方がいいでしょう。なぜなら、かなり厄介な知識のギャップがあるからです。しかし、提案をありがとう、非常に感謝します。 – Stevo