4

同時ハッシュマップを使用していて、値を設定および取得するメソッドがあった場合、同時ハッシュマップを使用しているため、ゲッターとセッターを同期させる必要がありますか? これは冗長ですか?1つのデザインの方が良いですか?

また、同期されていない同時ハッシュマップは、ゲッターとセッターが同期されているハッシュマップよりも高速ですか? これは高性能システム用です

ありがとうございました

4

2 に答える 2

7
  1. java.util.concurrent.ConcurrentHashMapスレッドセーフです
  2. 使うより速いsynchronized(object)
  3. このようなコードで「論理的な」競合状態を作成しないように注意する必要があります

    if (map.get(key) != null) {
        map.put(key, new SomethingStrictlyUnique());
    }
    
  4. 経験則として、同期コレクションを並行コレクションに置き換えると、ほとんどリスクを伴わずにスケーラビリティが大幅に向上します。

  5. javadocによると、 ConcurrentHashMap によって返される反復子は (フェイルファストではなく) 「弱い整合性」であるため、同時変更を許容し、反復子が構築されたときに存在していた要素をトラバースし、構築後のコレクションへの変更を反映する場合があります。イテレータ。

于 2011-01-15T21:07:02.670 に答える
1

1) 1 つの操作 (get メソッドが指定されたキーのマップ値のみを返すなど) またはスレッドセーフな操作のみを行う getter および setter メソッドがある場合、それらの getter に明示的な同期ブロックは必要ありません。 &セッター。

2) はい、同期ブロックなしで同時ハッシュマップを使用すると、パフォーマンスが大幅に向上します。

注 : ConcurrentHashMap は一貫性が弱く、ほとんどの場合は許容されます。

于 2013-11-15T17:53:16.337 に答える