2016-07-13 6 views
0

スレッドセーフな並行リストが必要です。同時に、反復処理に最適で、正確なサイズを返す必要があります。 商品のオークション入札を保存したいと思います。だから私は Concurrent LinkedListとConcurrentLinkedQueue

  • が与えられたアイテムのすべての入札を取得するアイテムに入札を追加した項目
  • のための入札の正確な数を取得

    1. にできるようにしたいです。
    2. 私は ConcurrentHashMap<Item, LinkedList<ItemBid>>でそれを持っていることを計画していた項目

    のための入札を削除 - LinkedListのは、スレッドセーフではなく、正確なサイズ ConcurrentHashMap<Item, ConcurrentLinkedQueue<ItemBid>>を返す - concurrentlinkedキューは、スレッドセーフですが、復帰に保証するものではありません正確なサイズ

    上記の4つのポイントに対処し、スレッドセーフです。

  • +0

    「正確なサイズ」とはどういう意味ですか? – bowmore

    答えて

    2

    確かにスレッドセーフなコレクションまたはマップでは、サイズの「一貫性」を保証することはできません。つまり、読み取り操作と書き込み操作の間の「起こり」関係が目的のユースケースに影響しません。そのサイズに対する読み出し操作は、最後の書き込み操作からの正確な状態を反映する値を返さなければなりません(NB:コメントに基づいて改善 - 以下を参照)。パフォーマンスが問題でない場合は、何ができるか

    は、次のイディオムを使用することである - のいずれか:

    • Collections.synchronizedMap(new HashMap<YourKeyType, YourValueType>());
    • Collections.synchronizedList(new ArrayList<YourType>());

    あなたは、その後も明示的にする必要がありますこれらのオブジェクトを同期させます。

    これにより、操作の順序がブロックされて一貫していることが保証され、最後の「正しい」サイズが常に得られるはずです。

    +2

    スレッドセーフなコレクションは_happens-before_を確立します。これは「スレッドセーフ」が意味するものの重要な部分です。あなたが言うことは、スレッドセーフティは_composable_ではないということです。つまり、アプリケーション内のすべてのオブジェクトがスレッドセーフであっても、_application_スレッドを安全にすることはできません。コレクションが「スレッドセーフ」であるという理由だけで、あるアプリケーションスレッドがそのコレクションに入れるものは、他のアプリケーションスレッドが見つけようとしているものであるとは決して保証されません。 –

    +0

    このコレクションは、1日に数百万の入札を取る大規模なオークションシステムの一部となるため、パフォーマンスが懸念されます。デコレータを使用してコレクションを同期すると、パフォーマンスに影響します。 – megan

    +0

    @ james_large公正なポイント、あなたの説明のためにありがとう。私はおそらく私が家に帰ったときにこれを編集すべきです:) – Mena

    1

    LinkedBlockingQueueを使用できます。それはブロックされています(CLQに並んでいます)が、サイズは維持され、CLQのようにスキャンされません。

    +0

    これは、Javaドキュメントごとにスレッドセーフではありません。 – megan

    +1

    私はあなたに保証します、 'LinkedBlockingQueue'は確実にスレッドセーフです。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue。htmlそれは、BlockingQueueの実装はスレッドセーフであると言います。 '。 –

    関連する問題