[解決済み] Java同期ブロックとCollections.synchronizedMapの比較
2023-05-05 11:34:47
質問
以下のコードで
synchronizedMap
?
public class MyClass {
private static Map<String, List<String>> synchronizedMap = Collections.synchronizedMap(new HashMap<String, List<String>>());
public void doWork(String key) {
List<String> values = null;
while ((values = synchronizedMap.remove(key)) != null) {
//do something with values
}
}
public static void addToMap(String key, String value) {
synchronized (synchronizedMap) {
if (synchronizedMap.containsKey(key)) {
synchronizedMap.get(key).add(value);
}
else {
List<String> valuesList = new ArrayList<String>();
valuesList.add(value);
synchronizedMap.put(key, valuesList);
}
}
}
}
私の理解では、同期ブロックは
addToMap()
を他のスレッドから呼び出されないようにするために
remove()
または
containsKey()
への呼び出しを通過する前に
put()
を呼び出す前に、同期ブロックは必要ありません。
doWork()
の同期ブロックに他のスレッドが入ることはできないからです。
addToMap()
の前に
remove()
でMapを作成したため
Collections.synchronizedMap()
. これは正しいのでしょうか? もっといい方法はないでしょうか?
どのように解決するのですか?
Collections.synchronizedMap()
は、マップ上で実行したい各アトミック操作が同期されることを保証します。
しかし、マップ上で2つ(またはそれ以上)の操作を実行する場合は、ブロック内で同期させる必要があります。 ですから、あなたは正しく同期しています。
関連
-
コンストラクタDate()が未定義である問題
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
StringBuilderが投げるArrayIndexOutOfBoundsExceptionの探索
-
無効なメソッド宣言
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
BindException: アドレスはすでに使用中です:バインドエラー解決
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
java send https request prompt java.security.cert.について。
-
maven レポート エラー 解決不可能な親POM
-
Java JDKのダイナミックプロキシ(AOP)の使用と実装の原理分析