問題タブ [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.

0 投票する
6 に答える
16479 参照

java - LinkedHashMapと同様の機能でConcurrentHashMapを実装するにはどうすればよいですか?

データのLRUキャッシュとして、いつでも最大500エントリを許可するLinkedHashMapとともにtrueを使用しました。accessOrderしかし、スケーラビリティの問題があるため、スレッドセーフな代替手段に移りたいと思います。ConcurrentHashMapその点では良いようですが、の機能が欠けており、にaccessOrderありremoveEldestEntry(Map.Entry e)ますLinkedHashMap。誰かがいくつかのリンクを指すか、実装を容易にするのを手伝ってくれますか?

0 投票する
5 に答える
18100 参照

java - Java ConcurrentHashMap を使用したキャッシュの実装

Web Java アプリケーションで重いオブジェクトの単純なキャッシュを実装したいと考えています。しかし、私はそれを適切に行う方法を理解できません。

何か足りないのでしょうか、それとも ConcurrentHashMap メソッド (putIfAbsent など) では不十分であり、追加の同期が必要ですか?

これを行うためのより簡単な API (メモリ ストレージ内、外部構成なし) はありますか?

P.

0 投票する
3 に答える
1303 参照

java - 値 (等しい) が等しい SoftReference の使用の可能性

私は以前、値 (equals) ベースの等価性を持つ SoftReference が必要な場合、これからインターナーを除いて、設計が悪いという結論に達しました。これは、そのようなクラスを含まない Google Collections および Guava に従っています。しかし、そのようなオブジェクトを使用できると思われる問題に遭遇しました。

ビジュアル エフェクト レンダー ファームにアセット管理システムがあり、レンダリングするフレーム数だけが異なる同じジョブを実行する数百のプロセスがあります。使用されたすべての資産を記録する必要がある Oracle データベースがあります。すべてのジョブから 1 つだけが成功する同一の挿入で Oracle をドキドキする代わりに、中間層の資産管理システムでは、HashSet を使用して、オブジェクトが Oracle に挿入されるかどうかを記録できます。

有効期限付きの Google MapMaker を使用することもできますが、有効期限を正しく設定することについて心配する必要はありません。レンダリングは数時間で実行され、場合によっては数日で実行されます。等値で SoftReference を使用すると、JVM がガベージ コレクションを自動的に管理するため、はるかに優れた方法のように思えます。

ガベージ コレクションを使用して ConcurrentHashMap で解決したい他の問題については、HashMap の強い参照をキーとして使用して equals() の等価性を取得し、SoftReference を値として使用して、JVM が何かをガベージ コレクションできるようにしますが、これではその場合、値は重要ではなく、SoftReference にラップしてそこに置く値がありません。したがって、equals() で SoftReference を使用するとうまくいくようです。

これに関する他の提案はありますか?

0 投票する
6 に答える
56787 参照

java - JavaのConcurrentHashMap?

ConcurrentHashMapJavaでの使用は何ですか? その利点は何ですか?それはどのように機能しますか?サンプルコードも役に立ちます。

0 投票する
3 に答える
3938 参照

java - Javaの同時実行性:「カスケード」変数の揮発性と最終性?

と同じ

内部マップが異なるスレッドによってアクセスされる場合は?

または、このようなものが必要です:

それが「カスケードされた」マップではない場合、final と volatile は最終的に、すべてのスレッドが常に Map の正しい内容を確認できるようにするという同じ効果があります...しかし、Map 自体にマップが含まれている場合はどうなりますか?例のように...内部マップが正しく「メモリバリア」であることを確認するにはどうすればよいですか?

タンク!トム

0 投票する
3 に答える
10361 参照

java - ConcurrentHashMap が「デッドロック」する可能性はありますか?

ConcurrentHashMap2 つのスレッドが を呼び出しput()、メソッド内で永久に待機しているように見えるという奇妙な問題に遭遇しましたUnsafe.park()。外側から見ると、内部は行き詰まりのように見えますConcurrentHashMap

これまでのところ、これが発生したのは 1 回だけです。

これらの症状を引き起こす可能性のある何かを考えられる人はいますか?

編集: 関連するスレッドのスレッド ダンプは次のとおりです。

0 投票する
6 に答える
21873 参照

java - ConcurrentHashMap に格納されたアトミック インクリメント カウンター

Web アプリのさまざまな場所からいくつかのメトリックを収集したいと考えています。簡単にするために、これらはすべてカウンターになるため、唯一の修飾子操作はカウンターを 1 増やすことです。

増分は同時に頻繁に行われます。読み取り (統計のダンプ) はまれな操作です。

ConcurrentHashMapを使用することを考えていました。問題は、カウンターを正しくインクリメントする方法です。マップには「インクリメント」操作がないため、最初に現在の値を読み取り、新しい値をマップに入れるよりもインクリメントする必要があります。これ以上のコードがなければ、これはアトミック操作ではありません。

同期なしでこれを達成することは可能ですか (これはConcurrentHashMapの目的を無効にします)? Guavaを見る必要がありますか?

ご指摘ありがとうございます。


PS SO ( Java で Map 値をインクリメントする最も効率的な方法
) に関する関連する質問がありますが、マルチスレッドではなくパフォーマンスに焦点を当てています

更新
同じトピックを検索してここにたどり着いた人のために: 以下の回答に加えて、偶然にも同じトピックをカバーする便利なプレゼンテーションがあります。スライド 24 ~ 33 を参照してください。

0 投票する
4 に答える
9645 参照

java - Java ConcurrentHashMapはスレッドセーフではありません..wth?

以前はHashMapを使っていました

同期ブロックを回避するためにConcurrentHashMapに切り替えましたが、サーバーに毎秒200〜400の同時クライアントが大量にロードされ、時間の経過とともに大きくなることが予想されるという問題が発生しています。

これは今このように見えます

私のサーバー設計はこのように機能します。大量のパケットを処理するためのワーカースレッドがあります。各パケットは、packetHandlerサブルーチン(スレッドの一部ではない)でチェックされます。ほとんどすべてのクライアントが、静的とほぼ同じようにいつでも呼び出すことができますが、そうではありません。

私のサーバー全体は、パケット処理部分を除いて、ほとんどシングルスレッドです。

とにかく、誰かがオンラインですべてのクライアントを数え、それらからいくつかの情報を取得するようなコマンドを使用するとき。

カウントの進行中にクライアントが切断されてConcurrentHashMapから削除される可能性もあります(これが私の問題の原因です)。

また、ここにいくつかのコードを追加したいと思います。

もちろん、イテレータ内にtry-catch例外を追加して、これらのnullクライアントをスキップすることで修正します。

しかし、上記のif(person!= null)をチェックしても、ネストされたコードが自動的に機能しないかどうかはわかりません。

それが反復中に削除されたことを意味しない場合、それはスレッドセーフなwtfであるため、不可能であるはずです。

私は何をすべきか?または、try-catch Exceptionが最善の方法ですか?

これが例外です

processPacketsには、上記のコードが含まれています。コメントは行数を示します#

私を啓発してくれてありがとう。

0 投票する
6 に答える
45351 参照

java - ConcurrentMapのputIfAbsentを使用する前に、マップにKeyが含まれているかどうかを確認する必要があります

複数のスレッドから使​​用できるマップにJavaのConcurrentMapを使用しています。putIfAbsentは優れたメソッドであり、標準のマップ操作を使用するよりも読み取り/書き込みがはるかに簡単です。私はこのように見えるいくつかのコードを持っています:

読みやすさに関してはこれは素晴らしいですが、すでにマップにある場合でも、毎回新しいHashSetを作成する必要があります。私はこれを書くことができます:

この変更により、読みやすさが少し失われますが、毎回HashSetを作成する必要はありません。この場合、どちらが良いですか?私はそれがより読みやすいので最初のものを支持する傾向があります。2つ目はパフォーマンスが向上し、より正確になる可能性があります。たぶん、これらのどちらよりもこれを行うためのより良い方法があります。

この方法でputIfAbsentを使用するためのベストプラクティスは何ですか?