21

私は、concurrenthashmap で約 1000 の要素を扱っています。デフォルトの同時実行レベルは 16 です。私のシナリオに適した同時実行レベルを特定できるアルゴリズムまたは要因、または同時実行レベルが複数のスレッドの処理にどのように影響するかを誰かが教えてくれますか?

   ConcurrentHashMap<String, String> map=new ConcurrentHashMap<String, String>(500,1,20);             

20 は私の同時実行レベル (ダミー値) です。これを効率的に設定する必要があります

4

5 に答える 5

21

ドキュメントによると:

更新操作間で許可される同時実行性は、オプションのconcurrencyLevelコンストラクター引数 (デフォルト16) によって決まります。これは、内部サイジングのヒントとして使用されます。テーブルは内部的に分割され、指定された数の同時更新を競合なしで許可しようとします。ハッシュ テーブル内の配置は基本的にランダムであるため、実際の同時実行数は異なります。 理想的には、同時にテーブルを変更するスレッド数に対応できる値を選択する必要があります。必要以上に高い値を使用すると、スペースと時間が浪費される可能性があり、極端に低い値を使用すると、スレッドの競合が発生する可能性があります。

したがって、1 つの質問に答える必要があります。

テーブルを同時に変更するスレッドの数は?

于 2013-08-28T12:44:03.200 に答える
12

Java 8:

現在、ConcurrentHashMapは固定ロック ストライピング スキームをまったく使用しておらず、代わりに各バケットが固有の同期を使用して「ストライプ」として機能しています。

ソースからのコード:

/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
    ...
    Node<K,V> f; int n, i, fh;
    ...
    else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
    ...
       synchronized (f) {
           ...
       }
}

そして、コンストラクターには、ドキュメントが言うように、サイズのヒントとして使用するパラメーターがあります。

concurrencyLevel - 同時に更新するスレッドの推定数。実装では、この値をサイジングのヒントとして使用できます。

そしてソース:

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor, int concurrencyLevel) {
    if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)
        throw new IllegalArgumentException();
    if (initialCapacity < concurrencyLevel)   // Use at least as many bins
        initialCapacity = concurrencyLevel;   // as estimated threads
    long size = (long)(1.0 + (long)initialCapacity / loadFactor);
    int cap = (size >= (long)MAXIMUM_CAPACITY) ?
        MAXIMUM_CAPACITY : tableSizeFor((int)size);
    this.sizeCtl = cap;
}

そのため、自分で考える必要はありませんConcurrentHashMap。あなたに代わって処理します。

于 2016-05-13T11:44:11.310 に答える
1

16 は、マップが分割されるデフォルトのリージョン数です。リーダー スレッドの場合、ConcurrentHashMap は (ほとんどの場合) まったくロックせずに実行されます。書き込みスレッドの数は、心配する必要があることです。そして、この数はあなたが持っている地域の数と同じでなければなりません。

于 2013-08-28T12:59:42.883 に答える