8

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

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

5 に答える 5

9

concurentHashMap.size()呼び出しの時点でわかっているサイズを返しますが、その間に別のスレッドがアイテムを追加/削除したため、その数値を使用すると古い値になる可能性があります。

ただし、ConcurrentMaps の全体的な目的は、スレッド セーフなコレクションであるため、同期する必要がないことです。

于 2012-04-25T10:14:09.383 に答える
2

複数の操作をアトミックに実行する必要がある非常にまれな場合を除いて、 Synchronized with 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());
    }
}

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

于 2012-04-25T10:13:27.820 に答える
2

を呼び出すだけaConcurrentHashmap.size()です。ただし、回答が得られる頃には、すでに時代遅れになっている可能性があることに注意してください。これは、別のスレッドが同時にマップを変更する場合に発生します。

于 2012-04-25T10:14:31.097 に答える