3

について読んでいましConcurrentHashMapた。

同期を必要とせず、反復中に Map を変更できるようにする Iterator を提供するため、ConcurrentModificationException.

ConcurrentHashMap別のスレッドが要素を変更した可能性があるため、反復中に要素を取得できない可能性があるため、これが良いことであるかどうか疑問に思っていました。

私の考えは正しいですか?はいの場合、それは良いですか悪いですか?

4

3 に答える 3

4

別のスレッドが要素を変更した可能性があるため、反復中に以前に ConcurrentHashMap に入れられた要素を取得できない可能性があるため、これが良いことであるかどうか疑問に思っていました。

これは問題ではないと思います。同期を使用し、反復を行うスレッドがたまたまロックを取得し、値を挿入するスレッドの前にそのループを実行する場合、同じステートメントが当てはまります。

あるアクションが別のアクションの後に (そしてその後にのみ) 実行されるようにするために、スレッド間で何らかの調整が必要な場合は、使用される Map のタイプに関係なく、この調整を管理する必要があります。

于 2013-06-04T14:39:57.980 に答える
1

通常、ConcurrentHashMap一貫性の低いイテレータで十分です。代わりに、強い一貫性のある反復子が必要な場合は、いくつかのオプションがあります。

  1. ctrieは、一定時間のスナップショットを提供するハッシュ配列マップ トライですデータ構造に使用できるJava ソース コードがあります。
  2. Clojure には、使用できるPersistentHashMapがあります。これにより、データのスナップショットを反復処理できます。
  3. を使用する代わりに、HSQLDBなどのローカル データベースを使用してデータを保存しますConcurrentHashMap。key|timestamp の複合主キーを使用し、値を「更新」するときは、代わりに現在のタイムスタンプで新しいエントリを保存します。イテレータを取得するには、where timetamp < System.currentTimeMillis()句を使用して結果セットを取得し、結果セットを反復処理します。

どちらの場合でも、スナップショットを反復処理しているため、強力に一貫性のある反復子が得られます。前者の場合はメモリ不足のリスクがあり、後者の場合はより複雑なソリューションになります。

于 2013-06-04T14:46:20.280 に答える
0

parallel -anythingの全体的なポイントは、並行アクティビティを認め、すべてのアクセスがシリアル化されていることを信頼しないことです。ほとんどのコレクションでは、要素間の整合性を確保するために作業を行わなければ期待できません。

最新のデータを見ることは気にしないが、データの一貫した (ただし古い可能性がある) ビューが必要な場合は、Finger Treesのような純粋に機能的な構造を見てください。

于 2013-06-04T14:48:25.597 に答える