問題タブ [concurrenthashmap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ConcurrentHashMap値の反復はスレッドセーフですか?
ConcurrentHashMapのjavadocは次のとおりです。
通常、取得操作 (get を含む) はブロックされないため、更新操作 (put および remove を含む) と重複する場合があります。検索は、開始時に保持されている最新の更新操作の結果を反映します。putAll や clear などの集計操作の場合、同時取得では、一部のエントリのみの挿入または削除が反映される場合があります。同様に、反復子と列挙型は、反復子/列挙型の作成時または作成後のある時点でのハッシュ テーブルの状態を反映する要素を返します。それらは ConcurrentModificationException をスローしません。ただし、反復子は、一度に 1 つのスレッドだけが使用できるように設計されています。
どういう意味ですか?同時に 2 つのスレッドでマップを反復しようとするとどうなりますか? 反復中にマップに値を追加または削除するとどうなりますか?
java - レースなしでConcurrentMultimapにremoveを実装する
私は並行マルチマップを作成する問題を検討してきましたが、 Google Guava AbstractSetMultimapと、ConcurrentHashMap上のセットビューとして値コレクションをオンデマンドで作成するMapMakerコンピューティングマップに裏打ちされた実装があります。ビューコレクションとさまざまなラッパーに注意を払うと、これはかなり近くなると思います。
これを試した他の人によってすでに議論されている大きな問題は、競合状態を導入せずに、値コレクションが空になったときに、基になるマップから値コレクションを削除することであるように見えます。
いくつかのオプションが存在するようです。
- 空のコレクションはそのままにしておきます。これにより一部のCHMがリークしますが、少なくとも正しいと思います。
- 空のときにコレクションを削除し、他に何かが表示されている場合は補正するように楽観的に試してください。これは人種でいっぱいで、修正することは本質的に不可能のようです。
- 値コレクションのすべてを同期します。これにより、少なくともこの削除が可能になりますが、キーによる最初のルックアップ後の同時実行が犠牲になります。
- より小さなペナルティ(おそらく、使用パターンに応じて?)の場合、おそらく値コレクションの作成と削除で同期し、それがすべてをカバーしているかどうかを確認する必要があります。
質問:
- これよりも優れた実装を知っている人はいますか?MapMakerのビットをより適切に作成できますか、それともゼロから作成された特殊なConcurrentHashMultimapが必要ですか?
- これを大幅に改善することが難しい場合、このリークは実際には多くの問題になる可能性がありますか?java.util.HashMap、juc.ConcurrentHashMap、ArrayDequeなどの注目すべきコレクションは、バッキングストアのサイズを下方に変更しません。また、ArrayListは自動的にサイズを変更しません。オブジェクトをクリアする限り、これはあまり重要ではないかと思います。
ありがとう
編集:グアバメーリングリストのここでの議論も参照してください。
編集2:それ以来私はこれを書きました。実装については、このGoogleコードエリアをご覧ください。ここではなく、そこで試してみた人からのフィードバックをいただければ幸いです。
java - ConcurrentHashMap の読み取り操作と書き込み操作を ReentrantLock でラップすることは良い方法ですか?
ConcurrentHashMap の実装では、ReentrantLock が既に使用されていると思います。そのため、ConcurrentHashMap オブジェクトへのアクセスに ReentrantLock を使用する必要はありません。そして、それは同期のオーバーヘッドを増やすだけです。コメントはありますか?
java - 並行コレクションを反復処理するときのスレッドセーフ
複数のスレッドを処理する必要があるクライアントサーバーアプリケーションを作成しています。数秒ごとに生きているパケットを送信するサーバーがいくつかあります。これらのサーバーはConcurrentHashMapで維持されます。このマップには、それぞれのサーバーの最後の生きているパッケージが到着した時刻とペアになっているEndPointが含まれています。
これでスレッドができました。このスレッドは、特定の時間、生きているパケットを送信していないすべてのサーバーを「分類」する必要があります。
そんなことはできないと思いますよね?
ループ全体のロックを取得せずにそれを回避する方法はありますか(他のスレッドでも尊重する必要があります)?
java - ConcurrentHashMap に欠点はありますか?
複数のスレッドからアクセスできる HashMap が必要です。
通常の HashMap を使用して同期する方法と、ConcurrentHashMap を使用する方法の 2 つの簡単なオプションがあります。
ConcurrentHashMap は読み取り操作でブロックしないため、私のニーズにははるかに適しているようです (ほとんど読み取りだけで、更新はほとんどありません)。一方、同時実行性は非常に低いと予想されるため、ブロッキングは発生しないはずです (ロックを管理するコストのみ)。
それが違いを生む場合、マップも非常に小さくなります (10 エントリ未満)。
通常の HashMap と比較して、読み取り操作と書き込み操作のコストはどのくらい高くなりますか? それとも、読み取り/更新の比率とサイズに関係なく、中程度のレベルの同時アクセスが存在する可能性がある場合でも、ConcurrentHashMap は常に優れているのでしょうか?
java - ConcurrentHashMapの例
ConcurrentHashMapの実装に関する優れた概要を説明する記事「Javaの理論と実践:より良いHashMapの構築」を読んでいました。
また、Stackoverflowでいくつかの議論をここで見つけました。
ConcurrentHashMapが使用されている「シナリオ/アプリケーション/場所は何ですか」ということを頭に入れていましたが、疑問に思います。
ありがとうございました
java - JavaにCopyOnWriteMapが付属していないのはなぜですか?
JDKにはとのCopyOnWrite*
実装が付属していますが、の実装はなく、私はこの事実をしばしば嘆きました。他にもコレクションの実装がありますが、標準で出荷された方がいいでしょう。それは明らかな省略のようであり、それには正当な理由があったのだろうかと思います。なぜこれが省略されたのか誰かが考えていますか?Set
List
Map
java - JavaConcurrentHashMapアトミックget(存在する場合)
並行ハッシュマップで現在の操作を安全に取得するにはどうすればよいですか?(putIfAbsentと同じもの)
悪い例、スレッドセーフではありません(状況を確認してから実行してください):
もう1つの悪い例は次のとおりです。
ここで望ましいのは、追加、削除、および取得操作を同期してボトルネックにしないことです。
ありがとう
java - ConcurrentHashMap を使用すると、データの可視性に関する問題が解消されますか?
Java Concurrency in Practiceを読んだところ、次の質問が残っています: ConcurrentHashMap を使用する場合、本の第 1 部で説明されているデータの同時実行の問題について、まだ心配する必要がありますか? 以下は、私のプログラムの 1 つからの例です。
1. トレーダーの現在のポジション(「整数」が数学用語である共有整数)
この数値は、trader
オブジェクトが現在所有しているものを表し、その状態を定義します。何をすべきかを知るために、その位置を読み取る必要があります (新しい位置を開始するか、現在の位置を管理するかを調べます)。 Trader
メソッドは独自のスレッドで実行されます。
broker
オブジェクトは の位置の設定を担当しますtrader
。トレーダーの注文の 1 つが約定されるたびにポジションが設定されます。 Broker
メソッドは独自のスレッドで実行されます。
trader
との両方がbroker
同じパッケージに入っています。位置は package-private として実装されていますstatic ConcurrentHashMap
。キーはトレーダー オブジェクトの ID です。値は整数です。
パッケージの外部はアプリケーションです。public getter を使用してトレーダーのポジションを間接的に取得します。
位置はせいぜい数分に 1 回しか変化しないため、broker
頻繁にマップに触れることはありません。ただし、trader
アプリケーションは頻繁に読み取ります。さらに、複数のトレーダーが同時にマップを読んでいることがよくあります。
このように ConcurrentHashMap を使用すると、ロックやデータの可視性について作業する必要がなくなりますか? ConcurrentHashMap がすべてを処理しますか?
2. 市場 (ビッド、アスク、最終価格)
ポジションとほぼ同じ状況broker
ですが、非常に頻繁に価格が更新されます (繁忙期には 1 秒間に最大 10 回、通常は 1 秒間に数回)。およびアプリケーションはtrader
、依然として頻繁に読み取りを行います。マップ キーは現在、どの株または先物かを示すコードであり、値は市場価格を保持するオブジェクトです。
問題なく動作しているように見えますが、JCIP を読んだ後、正しく実装されていないとプログラムが壊れる可能性があることに気付きました。この本は ConcurrentHashMap について語っていますが、手動で対処する必要がなくなったパート I の問題については明示的に教えていません。この場合、何もする必要はないようです。synchronize
あれは正しいですか?
java - 同時ハッシュマップは、同期されたゲッター/セッターを必要としませんか?
同時ハッシュマップを使用していて、値を設定および取得するメソッドがあった場合、同時ハッシュマップを使用しているため、ゲッターとセッターを同期させる必要がありますか? これは冗長ですか?1つのデザインの方が良いですか?
また、同期されていない同時ハッシュマップは、ゲッターとセッターが同期されているハッシュマップよりも高速ですか? これは高性能システム用です
ありがとうございました