同時ハッシュマップを使用していて、値を設定および取得するメソッドがあった場合、同時ハッシュマップを使用しているため、ゲッターとセッターを同期させる必要がありますか? これは冗長ですか?1つのデザインの方が良いですか?
また、同期されていない同時ハッシュマップは、ゲッターとセッターが同期されているハッシュマップよりも高速ですか? これは高性能システム用です
ありがとうございました
同時ハッシュマップを使用していて、値を設定および取得するメソッドがあった場合、同時ハッシュマップを使用しているため、ゲッターとセッターを同期させる必要がありますか? これは冗長ですか?1つのデザインの方が良いですか?
また、同期されていない同時ハッシュマップは、ゲッターとセッターが同期されているハッシュマップよりも高速ですか? これは高性能システム用です
ありがとうございました
java.util.concurrent.ConcurrentHashMap
スレッドセーフですsynchronized(object)
このようなコードで「論理的な」競合状態を作成しないように注意する必要があります
if (map.get(key) != null) {
map.put(key, new SomethingStrictlyUnique());
}
経験則として、同期コレクションを並行コレクションに置き換えると、ほとんどリスクを伴わずにスケーラビリティが大幅に向上します。
javadocによると、 ConcurrentHashMap によって返される反復子は (フェイルファストではなく) 「弱い整合性」であるため、同時変更を許容し、反復子が構築されたときに存在していた要素をトラバースし、構築後のコレクションへの変更を反映する場合があります。イテレータ。
1) 1 つの操作 (get メソッドが指定されたキーのマップ値のみを返すなど) またはスレッドセーフな操作のみを行う getter および setter メソッドがある場合、それらの getter に明示的な同期ブロックは必要ありません。 &セッター。
2) はい、同期ブロックなしで同時ハッシュマップを使用すると、パフォーマンスが大幅に向上します。
注 : ConcurrentHashMap は一貫性が弱く、ほとんどの場合は許容されます。