[解決済み] ConcurrentHashMapの値の反復はスレッドセーフか?
質問
のjavadocでは ConcurrentHashMap は以下の通りです。
検索操作(getを含む)は一般にブロックされないので、更新操作(putやremoveを含む)と重なる場合があります。検索は、その開始時に保持されている直近に完了した更新操作の結果を反映する。putAllやclearのような集約操作の場合、同時取得は一部の項目のみの挿入または削除を反映することがあります。同様に、イテレータと列挙は、イテレータ/列挙の作成時または作成以降のある時点におけるハッシュテーブルの状態を反映した要素を返します。これらはConcurrentModificationExceptionを投げない。 ただし、イテレータは一度に1つのスレッドのみが使用するように設計されています。
どういうことですか?2つのスレッドで同時にマップを反復処理しようとするとどうなるのでしょうか?反復処理中にマップに値を入れたり、削除したりするとどうなりますか?
解決方法は?
<ブロッククオートどういう意味ですか?
つまり、あなたが取得した各イテレータは
ConcurrentHashMap
は1つのスレッドで使用するように設計されており、他のスレッドに渡してはいけません。これには、for-eachループが提供する構文上の糖分が含まれます。
2つのスレッドで同時にマップを反復処理しようとするとどうなるのでしょうか?
それぞれのスレッドが独自のイテレータを使用する場合は、期待通りに動作します。
<ブロッククオートイテレート中にマップに値を入れたり、削除したりするとどうなるのでしょうか?
このようなことをしても、物事が壊れないことが保証されています(それは、quot;concurrent" の内容の一部です)。
ConcurrentHashMap
を意味します)。しかし、あるスレッドが、他のスレッドが実行したマップの変更を(マップから新しいイテレータを得ることなく)見ることができるという保証はない。イテレータは、それが作成された時点のマップの状態を反映することが保証されています。それ以降の変更はイテレータに反映されるかもしれないが、反映される必要はない。
結論から言うと、次のような文は
for (Object o : someConcurrentHashMap.entrySet()) {
// ...
}
は、ほぼ毎回問題なく(あるいは少なくとも安全に)見ることができます。
関連
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
Javaクラスローダーにソースコードから潜り込む
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
HttpClientがGZIP形式でない場合の対処法
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] プロセスとスレッドの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
java の例外が発生しました java
-
IllegalArgumentException この例外を解決する方法
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
org.glassfish.jersey.servlet.ServletContainer
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
ローカルリソースのロードが許可されていない場合の解決策