問題タブ [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 (put はスレッド セーフ) を使用していて、ConcurrentHashMap put を使用するパブリック関数 myPut を提供する場合、関数を同期する必要がありますか?
意味 : これを同期する必要がありますか?
java - 2-D (同時) HashMap: 2 プロパティ キー タイプ? ハッシュマップのハッシュマップ? [アップデート]
だから私は2次元が必要ConcurrentHashMap
です。
非常に頻繁に値を追加および更新するため、可能な限り高速である必要があります。これはマルチスレッド アプリケーションであるため、HashMap だけでなく ConcurrentHashMap を使用することを選択しました。
「x」と「y」の両方のインデックスは、既知の範囲 (0 ~ 40,000,000) の整数です。
私が知る必要があるのは、これを実装する最も効率的な方法は何ですか?可能な限り高速になりますか? 最も明白なルートは、リテラルの 2-D ハッシュマップを実行することです。
ConcurrentHashMap<Integer, ConcurrentHashMap<Integer, ValueObj>> foo;
または、x と y の 2 つのプロパティを持つプライベート クラス "IntPair" を作成し、それをキーとして使用することもできequals()
ますhashcode()
。そして、あまりにも多くの new を割り当ててしまうIntPair
のでしょうか? 割り当てた x/y ごとに s のセットを保持IntPair
し、まったく同じオブジェクト インスタンスをチェックするだけのように、純粋に再帰的な equals() を使用できますか?
アップデート:
Integer.valueOf(int) を詳しく見てきたので、予測できないエントリを含む非常にまばらな行列を扱っているため、使用する特定のキャッシュ モデルはここでは意味をなさないでしょう。事前に指定されたサブセットではなく、使用されるすべての IntPairs をキャッシュする必要があります。
直感的には、大きなマップで IntPair を調べて、それが既に作成されているかどうかを確認することは、実際には、大きな「2-D」で調べるのとほぼ同じであるように思えます。とにかく ConcurrentHashMap ですね。したがって、ここでの解決策はnew IntPair(x,y)
、キーを検索するたびに使用することです。はい?
java - ConcurrentHashMap が null キーと null 値を防ぐのはなぜですか?
の JavaDoc にConcurrentHashMap
は次のように書かれています。
と同様
Hashtable
ですが、このクラスとは異なりHashMap
、このクラスをキーまたは値として使用することはできません。null
私の質問: なぜですか?
Hashtable
2 番目の質問: null を許可しないのはなぜですか?
データを格納するために多くの HashMaps を使用しました。しかし、に変更するConcurrentHashMap
と、NullPointerExceptions のために何度か問題が発生しました。
java - ConcurrentHashMap 修飾子の同期
の助けを借りて IO をキャッシュしたいと思いConcurrentHashMap
ます。バイナリ ファイルの変更は、キャッシュにも反映されるはずです。キャッシュは複数のスレッドで使用されるため、すべての IO 操作が同期されます。マップの変更は同じsynchronized
ブロック内に入ります。大まかに次のようになります。
と
map
とはどちらfile
も非公開であり、キャッシュ クラスの外部からは見えません。
キャッシュ読み取り、つまりブロックmap.get(index)
なしで行った場合、スレッドセーフは保持されますか?synchronized
前述したように、ConcurrentHashMap
マップの実装として使用されます。
java - ConcurrentHashMapコンストラクターパラメーター?
私は:を構築するためのパラメータについて疑問に思っていますConcurrentHashMap
:
initialCapacity
デフォルトでは16です(理解されています)。loadFactor
デフォルトでは0.75です。concurrencyLevel
デフォルトでは16です。
私の質問は次のとおりです。
- 上または下に調整するには、どのような基準を使用する必要があります
loadFactor
か? - 同時に更新するスレッドの数をどのように確立しますか?
- 上または下に調整するには、どのような基準を使用する必要があります
concurrencyLevel
か?
さらに:
- 優れたハッシュコード実装の特徴は何ですか?(SOの質問がこれに対処している場合は、それにリンクするだけです。)
ありがとうございました!
java - 未使用のマップ要素をクリーンアップ/削除するJavaの戦略
現在のスレッドがどのWebサイトコンテキストにあるかを設定および取得するために呼び出すことができる「マネージャー」をWebアプリに実装しています(Webサイトコンテキストが現在のサイトを表すように、サイトにホワイトラベルを付けます)
私はこれを行うための最良の戦略を見つけようとしています。現在、同時ハッシュマップでWebSiteContextsへのスレッドのストアを実装しています。
スレッドの開始時に(サーブレットフィルタを介して、または手動で設定することにより)、スレッドはそのWebSiteContextに関連付けられます。
ただし、メモリリークを回避するために、マップをクリーンアップする必要があります。したがって、1つの戦略は、マップのスレッドキーを繰り返し処理して、スレッドが「生きている」かどうかを確認し(thread.isAlive())、そうでない場合は、たとえば次のように削除することだと思います。
、しかし、これは私が避けたいものであるマップへのアクセスを同期する必要があると思います(またはそうしますか?)。
Javaのスレッドに属性を格納したり、実際にスレッドオブジェクトをキーとして持つマップをクリーンアップしたりするための「慣用的な」パターンはありますか?私はWeakReference/SoftReferencesを使用することにオープンです。実際、Thread.getCurrentThread()。setAttribute(Object、Object)に相当するものがある場合は、それは素晴らしいことです。
乾杯サイモンB
java - ConcurrentHashMapおよびputAll()メソッド
通常(つまり、同時にではない)、に渡す他のマップを構築するコストを除外したとしても、にputAll()
多くの呼び出しを使用するよりも効率的ではありません。これは、渡されたMapの要素を反復処理する必要があるだけでなく、実行するMapに各キーと値のペアを追加するためのアルゴリズムを実行する必要があるためです。put()
putAll()
putAll()
put()
putAll()
しかし、ConcurrentHashMapの場合、通常のMapを作成してから、それを更新するために使用するのは理にかなっていますか?または、10回(または100回、または1000回)の呼び出しを行う必要がありput()
ますか?
への複数の呼び出しの答えは変わりますputIfAbsent()
か?
ありがとう!
java - ConcurrentHashMap.get()は、別のスレッドによって以前のConcurrentHashMap.put()を参照することが保証されていますか?
別のスレッドで前を見ることが保証されていますか?私の期待はそうです、そしてJavaDocsを読むことはそう示しているようです、しかし私は99%が現実が違うと確信しています。私の本番サーバーでは、以下のことが起こっているようです。(私はロギングでそれを捕らえました。)ConcurrentHashMap.get()
ConcurrentHashMap.put()
擬似コードの例:
起こっているように見えるのはこれです:
したがって、私の出力は次のようになります。
2番目のスレッドはすぐにプットを見ません!なんで?私の本番システムでは、より多くのスレッドがあり、スレッド1の直後に続く最初のスレッドである1つのスレッドだけに問題があります。
ConcurrentHashMapの同時実行レベルを1に縮小しようとしたこともありますが、それは問題ではありません。例えば:
どこが間違っているのですか?私の期待?または、これを引き起こしている私のコード(上記ではなく実際のソフトウェア)にいくつかのバグがありますか?私はそれを繰り返し調べましたが、99%はロックを正しく処理していると確信しています。ConcurrentHashMap
またはJVM のバグを推測することすらできません。私を自分から救ってください。
関連する可能性のあるGoreyの詳細:
- クアッドコア64ビットXeon(DL380 G5)
- RHEL4(
Linux mysvr 2.6.9-78.0.5.ELsmp #1 SMP
...x86_64 GNU/Linux
) - Java 6(
build 1.6.0_07-b06
、64-Bit Server VM (build 10.0-b23, mixed mode)
)
java - ConcurrentHashMap に 32 個を超えるロックを設定することは可能ですか?
ConcurrentHashMap は、マップ全体のロックではなくバケット レベルでロックを行うため、Hashtable よりもマルチスレッドでうまく機能することを読みました。マップごとに最大 32 個のロックが可能です。なぜ 32 で、なぜ 32 を超えないのか知りたいです。
java - ConcurrentSkipListMap はいつ使用する必要がありますか?
Javaでは、ConcurrentHashMap
より良いmultithreading
解決策があります。では、いつ使用する必要がありますConcurrentSkipListMap
か?それは冗長性ですか?
これら 2 つの間のマルチスレッドの側面は共通ですか?