2012-04-16 6 views
0

FastMap.valuesを反復処理する必要があります。 私の問題は、基本的なループがnullポインタ例外 - FastMap値を反復する

Collection<Order> orders = myObject.getOpenOrders(); 
    for (Order order : orders) { 
} 

問題は、私のシステム内の別のスレッドがfastmap それは追加し、それに要素を削除してを編集し、私はNullPointerExceptionが取得することでNullPointerExceptionが

基本ループの上に失敗したということです。 まれですが、解決する必要があります。

は、だから私は

Collection<Order> orders = myObject.getOpenOrders(); 
    for (Order order : orders) { 
     if (order != null) 
    } 

とまだ私は は、だから私は

FastMap<String, Order> openOrders = myObject.getOpenOrdersMap(); 
    for (FastMap.Entry<String, Order> e = openOrders.head(), end = openOrders.tail(); (e = e.getNext()) != end && e != null;) { 
     Order order = e.getValue(); 
    } 

に従いますが、それは投げるのではなく、nullになったときに、ループが停止したとして、それを反復処理しようとしたNullPointerExcetionに取得ヌルチェックを追加しましたNullPointerExcetion。 また、すべての要素を反復処理する必要があるので、これも問題です。

私は、iterationがvalues()を使用し、実際にはリストへのポインタであるという問題があると想定します。 リストをコピーしようとしましたが、コピープロセスでNullPointerExcetionも取得しました。 すべてのご意見

私はデザイン全体を変更することが最良の解決策であり、すべての挿入と読み取りでロックを使用することを知っています。私の問題を解決するために私が作ることができるいくつかの小さな変化がありますか?

+1

Javolution 'FastMap'? IIRC、Javolutionはあらゆる種類の野生の主張をしましたが、実装は間違っていました。コンカレントコレクションが本当に必要な場合は、 'java.util.concurrent'を提案します。/'NullPointerException'には、トリガされた場所の詳細が含まれている必要があります。 –

答えて

2

これはJDKクラスではありませんか? (?Javolution) ドキュメントが言うから:

マップはを共有マークされている場合は、すべての操作はそうあなたには、いくつかの並行処理が発生する可能性があり、スレッドセーフ マップのコレクション

以上の反復を含めています問題? それを試してみてください。

FastMap<String, Order> openOrders = myObject.getOpenOrdersMap().shared()

+1

Javolutionのドキュメントは信じられません。 –

+0

その価値は試してみる価値があります。 –

+0

@ TomHawtin-tacklineあなたが正しく、それはハッシュテーブルに効果的に変換されます。そして、たとえputとgetの共有マップの間に何らかの対立関係がなくても、スレッドセーフではありません。 –

2

マルチスレッド環境の場合は、特にイテレータで作業する場合は、絶対に何らかの同期を使用する必要があります。

他のスレッドが編集中にコレクションを反復することはできません。これはイテレータを無効にしてすべてを破壊します。

したがって、錠剤を飲み込んで同期をとるには、この状況が必要です。

関連する問題