ConcurrentHashMap (put はスレッド セーフ) を使用していて、ConcurrentHashMap put を使用するパブリック関数 myPut を提供する場合、関数を同期する必要がありますか?
意味 : これを同期する必要がありますか?
ConcurrentHashMap map;
public void myPut(int something) {
this.map.put(something);
}
ConcurrentHashMap (put はスレッド セーフ) を使用していて、ConcurrentHashMap put を使用するパブリック関数 myPut を提供する場合、関数を同期する必要がありますか?
意味 : これを同期する必要がありますか?
ConcurrentHashMap map;
public void myPut(int something) {
this.map.put(something);
}
map
参照が宣言されていないため、final
変更される可能性があります。したがって、ここには潜在的なスレッドのバグがあります。
可変参照であると想定される場合map
は、さらに作業を行う必要があります。それ以外の場合はを使用しますfinal
。確かに、final
そうしないほうが「簡単」であっても、できる限り使用してください。「final
新しい[古い]private
です。」map
private
あなたはおそらく、ジェネリックも作りたいと思うでしょう。
ConcurrentHashMap などの同時実行ユーティリティは、同期する必要がないように設計されています。内部でスレッド セーフなアクセスを処理します。
Tom が言っていることは、マップ参照が変更される可能性について考える必要があるということです。参照が実際に変更されない場合、実際にはここで問題を解決できます: ConcurrentHashMap の内部同期 (実際には java.util.concurrentlibrary 一般) により、マップに配置されたオブジェクトが安全に公開されることが保証されます。他のスレッドへ。しかし、それでも、参照が変更できるかどうかを判断し、コードでこれを明示的に記述することをお勧めします (変更できない場合は「final」、変更できない場合は「volatile」または AtomicReference など)。できる)。
ConcurrentHashMap を使用する場合、'put' を同期するべきではありませんが、'puts' が一度に呼び出されるという意味ではありません。これは、マップの同時実行レベルによって異なります...
ですから、自分が何を望んでいるのかを知らなければなりません。
ところで、 ConcurrentHashTable Javadoc を見てください。すべてがよく説明されています...
-パトリック
場合によります。
複数のスレッドから使用されるオブジェクトのクラスを作成すると、ゲーム全体が変わります。スレッドの安全性を保証したい場合は、達成しようとしている結果を理解する必要があります。
この場合、これがクラス内の唯一のメソッドである場合、このメソッドへのアクセスを同期しても意味がありません。しかし、それが唯一の方法というわけではありません - それはクラスをかなり無意味にするからです。
このメソッドを同期する必要があるのは、他の理由でクラス スレッドを安全にするために必要な場合のみですConcurrentHashMap
。
いいえ
。一度に複数回 myPut を呼び出すことができます。
HashTable のアクセスは一度に 1 つである必要があるため、put は一度に 1 つずつ呼び出されます。(共有メモリへの同時書き込みも参照)