0

FastMap.values を反復処理する必要があります。私の問題は、基本的なループが NullPointerException で失敗することです

基本ループ

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

問題は、システム内の別のスレッドが fastmap を編集し、それに要素を追加および削除していて、NullPointerException が発生することです。まれですが、解決する必要があります。

だから私はヌルチェックを追加しました

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

それでも NullPointerExcetion を取得するので、次のように繰り返してみました

    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();
    }

ただし、NullPointerExcetion をスローする代わりに、null になるとループが停止します。すべての要素を反復する必要があるため、これも問題です。

問題は for 反復が values() を使用し、実際にはリストへのポインターであることだと思います。リストをコピーしようとしましたが、コピー プロセスで NullPointerExcetion も取得します。任意の提案

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

4

2 に答える 2

2

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

別のスレッドがコレクションを編集している間、コレクションを反復することはできません。これにより、反復子が無効になり、すべてが壊れます。

したがって、ピルを飲み込んで同期を使用してください。この状況ではそれが必要です。

于 2012-04-16T14:17:50.840 に答える
2

これはJDKクラスではありませんか? (ジャボリューション?)ドキュメントの言うことから:

マップが共有としてマークされている場合、マップのコレクションに対する反復を含むすべての操作はスレッドセーフです

それで、並行性の問題が発生する可能性がありますか?それを試してください:

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

于 2012-04-16T14:22:00.827 に答える