ConcurrentMap の putIfAbsent を使う前に、map に key が含まれているかどうか確認する必要がある。
質問
複数のスレッドから使用できるマップのために、JavaのConcurrentMapを使用しています。putIfAbsentは素晴らしいメソッドで、標準のマップ操作を使用するよりもはるかに簡単に読み書きができます。私は以下のようなコードを持っています。
ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>();
// ...
map.putIfAbsent(name, new HashSet<X>());
map.get(name).add(Y);
読みやすさは抜群ですが、すでにマップにある場合でも毎回新しいHashSetを作成する必要があります。私はこう書くことができました。
if (!map.containsKey(name)) {
map.putIfAbsent(name, new HashSet<X>());
}
map.get(name).add(Y);
この変更により、可読性は少し落ちますが、毎回HashSetを作成する必要はありません。この場合、どちらが良いのでしょうか?私は、より可読性が高いので、最初の方を支持する傾向があります。しかし、2つ目の方法の方が、パフォーマンスが良く、より正しいかもしれません。もしかしたら、これらのどちらかよりも良い方法があるかもしれません。
この方法でputIfAbsentを使用するためのベストプラクティスは何ですか?
どのように解決するのですか?
並行処理は難しいです。もし、素直なロックの代わりに並行マップをわざわざ使うのであれば、それに越したことはないでしょう。実際、必要以上にルックアップを行わないようにしましょう。
Set<X> set = map.get(name);
if (set == null) {
final Set<X> value = new HashSet<X>();
set = map.putIfAbsent(name, value);
if (set == null) {
set = value;
}
}
(通常のstackoverflowの免責事項: 私の頭の上にオフ。テストしていません。コンパイルされていません。等々)
更新しました。
1.8で追加された
computeIfAbsent
にデフォルトメソッド
ConcurrentMap
(そして
Map
というのは興味深いことで、この実装は
ConcurrentMap
). (そして1.7では"diamond operator"が追加されました。
<>
.)
Set<X> set = map.computeIfAbsent(name, n -> new HashSet<>());
(注意:このメソッドで行われるすべての操作のスレッドセーフはあなたの責任で行ってください。
HashSet
に含まれる
ConcurrentMap
.)
関連
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
-bash: java: コマンドが見つからない 解決方法
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
eclipse にリソースリーク:'in' が閉じない
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
-
[解決済み] Java の assert キーワードは何をするのか、そしていつ使うべきなのか?
-
[解決済み] ConcurrentHashMapとCollections.synchronizedMap(Map)の違いは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
executeQuery()でデータ操作文が発行できない。解決方法
-
型に解決できない エラー解決
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
Javaジェネリックを1つの記事で
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Javaがエラーで実行される、選択が起動できない、最近起動したものがない
-
Java基礎 - マッピングとQ/A
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
htmlとwordの相互変換の実装(画像あり)