2012-01-29 7 views
4

get(Key)メソッドでは、アンダーレイマップに変更がない場合、標準HashMapConcurrentHashMapのパフォーマンスが同じです(get() 。背景と行って)Java Concurrency:HashMapとConcurrentHashMapのget(Key)はパフォーマンスが同じですか?

アップデート:私はnead「同時実行/ threadsafety」を行うだけで、非常にめったに起こらないプット、上とプットのために、私は地図の関連付けを入れ替えることができます:

同時実行はかなりkomplexトピックです。それ自身(原子とスレッドセーフです)。したがって、私はたくさんの取得をしています(そして、HashMaで実装するかp(一時的なハッシュマップの作成、新しいHashMapへのデータのコピー、および関連付けのスワップ)、またはConcurrentHashMapを使用して...私のアプリケーションは本当にたくさんのことをしています。愚かなことに、インターネットはあまりにも多くの不必要な情報を持っていますが、これはもっと多くの人々にとって興味深いと思われるものです。だから誰かがConcurrentHashMapの内部動作を知っていれば、その質問に答えることは素晴らしいだろう。

ありがとうございました!

+2

ConcurrentHashMapはスレッドセーフです。それはそれに対するすべての操作のオーバーヘッドが付属しています。しかし、あなたのアプリが時間の90%を値から取得しない限り、違いを気付かないでしょう。 – bdares

+0

こんにちは、なぜ私はdownvoteを取得するのですか?理由を説明してください! – user1145216

+0

あなたはAPIを見ましたか?書き込みは同期され、取得は行われないことが明確に示されています。知るべきことは他に何がありますか? – blackcompe

答えて

2

ソースコードを見ることができます。 (私はJDK 6で探しています)HashMap.get()非常に単純です:

ハッシュ()
public V get(Object key) { 
     if (key == null) 
      return getForNullKey(); 
     int hash = hash(key.hashCode()); 
     for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
      e != null; 
      e = e.next) { 
      Object k; 
      if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
       return e.value; 
     } 
     return null; 
    } 

は、あなたのハッシュコードを「改善」するためにいくつかの余分なシフトとXOR演算を行います。

ConcurrentHashMap.get()もう少し複雑ではなく、多く再び

public V get(Object key) { 
    int hash = hash(key.hashCode()); 
    return segmentFor(hash).get(key, hash); 
} 

、ハッシュ()は、いくつかのシフト及びXOR演算を行います。 setMentFor(int hash)単純な配列検索を行います。唯一の複雑なものはSegment.get()です。しかし、たとえそれはロケット科学のようには見えません。

V get(Object key, int hash) { 
    if (count != 0) { // read-volatile 
     HashEntry<K,V> e = getFirst(hash); 
     while (e != null) { 
     if (e.hash == hash && key.equals(e.key)) { 
      V v = e.value; 
      if (v != null) 
       return v; 
      return readValueUnderLock(e); // recheck 
      } 
      e = e.next; 
     } 
} 
    return null; 
} 

ロックを取得している一つの場所)がreadValueUnderLock(です。コメントは、これはメモリモデルの下では技術的には合法だが、発生することは知られていないと述べている。

全体的に見て、コードはかなり類似しているようです。 ConcurrentHashMapでちょっと整理されています。だから私はパフォーマンスが十分に似ていると思います。

しかし、putsが本当に非常に稀であれば、「コピーオンライト」タイプのメカニズムを実装することを検討できます。

2

APIによると、検索方法のロックはありません。だから、私は彼らのパフォーマンスが同等だと思います。

3

あなたは間違った質問をしています。

同時実行が必要な場合は、としてください。パフォーマンスに影響はありません。

正しく動作するプログラムは、通常、より高速なプログラムよりも高いランク付けをします。私は「ほぼいつも」と言います。なぜなら、バグが修正されるまで、ソフトウェアをリリースするのはビジネス上の理由があるからです。

関連する問題