2012-04-25 17 views
7

並行ハッシュマップは、ハッシュマップに見られる同期の問題を解決できます。したがって、ハッシュマップとキー操作を同期させると、追加と削除が高速になります。 concurrentHashMapのサイズを複数のスレッドがチェックしている場合、ハッシュマップサイズのチェックはどうですか?次のような何か:我々はまだsynchronzationキーワードが必要なのです同時HashMap:サイズの確認

public static synchronized getSize(){ 
    return aConcurrentHashmap.size(); 
} 

答えて

8

concurentHashMap.size()は、その時点で既知のサイズを返しますが、その間に別のスレッドが項目を追加/削除したため、その数値を使用すると無効な値になることがあります。 ConcurrentMapsの全体の目的は、それがスレッドセーフのコレクションであるとして、あなたはそれを同期する必要がないということであるしかし

1

あなたはアトミック複数の操作を実行する必要が非常にまれで除いConcurretnHashMapと同期して使用する必要はありません。

サイズを取得するだけで、同期させることなく呼び出すことができます。


私はConcurrentHashMapの同期を使用する際に明確にする...

はあなたがオンデマンドで作成する高価な物を持っていると言います。同時読み込みを行いたいだけでなく、値が一度だけ作成されていることを確認したい場合もあります。

public ExpensiveObject get(String key) { 
    return map.get(key); // can work concurrently. 
} 

public void put(String key, ExepensiveBuilder builder) { 
    // cannot use putIfAbsent because it needs the object before checking. 
    synchronized(map) { 
     if (!map.containsKey(key)) 
      map.put(key, builder.create()); 
    } 
} 

注:これは、すべての書き込みが同期されている必要がありますが、読み込みは引き続き可能です。

+0

ConcurrentHashMapは内部的に同期されています。上に独自の同期ブロックを追加しても、あなたが望むものが得られない場合があります。 – krock

+0

@krockどのように使用するか注意する必要があります。例を追加する。 –

2

aConcurrentHashmap.size()と呼ぶことができます。しかし、あなたが答えを得た時点ですでに廃止されている可能性があることに留意する必要があります。これは、別のスレッドがマップを同時に変更する場合に発生します。 isEmpty()またはsize()のような完全なHashMapの上で動作させる方法と比べてget()put()remove()

0

のConcurrentHashMapの設計者は次のように個々の操作にweightageを与えると考えます。これは、(一般的に)呼び出されるこれらのメソッドの変更が、他の個々のメソッドよりも少ないために行われます。 size()ため

同期はここでは必要ありません。我々はconcurentHashMap.size()メソッドを呼び出すことによってサイズを得ることができます。このメソッドは、他のスレッドがその間にマップを変更する可能性があるため、古い値を返すことがあります。しかし、これは、これらの操作がデリバリ化されているため、明白に壊れていると考えられます。

関連する問題