同期ブロックまたはロックを使用して静的ConcurrentHashmapを外部同期する必要がありますか?静的ConcurrentHashmapで外部同期が必要です
答えて
いいえ:外部と同期する必要はありません。
java.util.concurrent
クラスのすべてのメソッドはスレッドセーフです。
私が知っている限り、すべての必要なロックがこのクラスで行われているので、あなたはいくつかの特定のことをしていない場合にそれを心配する必要はありません。 http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ConcurrentHashMap.htmlで
それは言う:
しかし、すべての操作は、検索操作がロック伴わないので、スレッドセーフであり、すべての防止方法で、テーブル全体をロックするための任意のサポートがないにもかかわらず、アクセス。
一般に、取得操作(getを含む)はブロックされないため、更新操作(putおよびremoveを含む)と重複する可能性があります。取得は、直前に完了した更新操作の結果を反映します。
これは、特定のアプリケーションで問題が発生していない場合でも、気にする必要はありません。
コレクションをロックする必要がある場合は、外部同期のみが必要です。コレクションは内部ロックを公開しません。
ConcurrentMapにputIfAbsentが設定されていますが、オブジェクトの作成に費用がかかる場合は、これを使用したくない場合があります。
final ConcurrentMap<Key, Value> map =
public Value get(Key key) {
// allow concurrent read
return map.get(key);
}
public Value getOrCreate(Key key) {
// could put an extra check here to avoid synchronization.
synchronized(map) {
Value val = map.get(key);
if (val == null)
map.put(key, val = new ExpensiveValue(key));
return val;
}
}
はい、いいえ。あなたがやっていることに依存します。 ConcurrentHashMapは、すべてのメソッド(getやputなど)に対してスレッドセーフです。ただし、非アトミック操作の場合はでなく、スレッドセーフです。ここでの例では、非アトミック動作を行う方法であって
public class Foo {
Map<String, Object> map = new ConcurrentHashMap<String, Object>();
public Object getFoo(String bar) {
Object value = foo.get(bar);
if (value == null) {
value = new Object();
map.put(bar, foo);
}
return value;
}
}
ここで欠陥はgetFoo
を呼び出す2つのスレッドが別のオブジェクトを受信することが可能であることです。 int
のような簡単なデータ構造やデータ型を扱う場合、非アトミック操作では常に外部同期が必要です。 AtomicIntegerやConcurrentHashMapなどのクラスは、いくつかの一般的な操作をスレッドセーフにしますが、上記のgetFoo
のようなチェック・セット・セット操作に対しては保護しません。
- 1. Java外部クラス静的初期化
- 2. Webpackで同期が必要
- 3. FinalConstruct()/ FinalRelease()の内部で同期が必要ですか?
- 4. onSensorChanged(...)で同期が必要ですか?
- 5. ConcurrentHashMap修飾子の同期
- 6. Androidのアダプターは、静的内部クラスまたは非静的内部クラスである必要があります
- 7. ConcurrentHashMap:コレクションを値として保存するときの同期の必要性
- 8. ConcurrentHashMapがあるので、Hashtableが必要ですか?
- 9. 非同期コールバックが必要ですか?
- 10. 外部ディレクトリが必要です
- 11. 同期メソッドConcurrentHashMapの同時実行レベル
- 12. Cでの外部ポインタと静的ポインタ
- 13. java静的メソッドなぜ必要です
- 14. ERROR静的メソッドにはnullインスタンスが必要です。非静的メソッドにはnull以外のインスタンスが必要です
- 15. assertTrueステートメントではインテリジェントIDEAで静的インポートが必要ですか?
- 16. スレッド内の静的同期と非静的同期メソッドの違い
- 17. なぜ外部同期は内部同期より高速ですか?
- 18. Javascript:AMD(非同期モジュール定義)で「同期」メソッドが必要ですか?
- 19. Cmake:静的リンクではランタイムにライブラリが必要です(appcrash 0xC0000135)
- 20. 外部変数が静的ライブラリ内でリンクに失敗する
- 21. ConcurrentHashMapの値はデフォルトで同期していますか?
- 22. C++静的ライブラリの必要な部分のみをリンクする
- 23. ConcurrentHashMapでの同時修正
- 24. リストビューカスタムアダプターに静的メソッドが必要
- 25. 静的メソッドのヘルプが必要な
- 26. アドバイスが必要:JAVAインターフェースの静的メソッド
- 27. nodejs非同期ウォーターフォール使用関数外部から必要なjavascriptファイル
- 28. スタティックにリンクするには静的ライブラリが必要ですか?
- 29. フレームワークを作成する静的ライブラリが必要ですか?
- 30. CustomFieldSerializerに静的メソッドが必要なのはなぜですか?
スレッドセーフであるとは、外部と同期する必要はありません。マップがどのような目的で使用されているかを知る必要があります。 (元のクラスの "threadsafety"はかなり不必要で不十分であったため、同じ理由で、Javaで導入された非同期コレクションクラス)。 – Thilo
質問から利用情報を選ぶことはできません。確かにdownvoteの人には十分ではありません。 – Bohemian
それはピーターの答えと同じレベルにそれを持って来るために "相対的なdownvote"でした。もし私が代わりにできるなら、私は彼を2度upvotedしていただろう。 – Thilo