Frage

Ich lese ConcurrentHashMap funktioniert besser in Multi-Threading als Hashtable wegen Sperren auf bucket Pegel anstatt Karte breite Sperre. Es ist auf maximal 32 Schleusen möglich pro Karte. warum 32 und warum nicht mehr als 32 Schleusen wissen will.

War es hilfreich?

Lösung

Wenn Sie reden über die Java ConcurrentHashMap, dann ist die Grenze beliebige :

  

Erstellt eine neue Karte mit den gleichen Zuordnungen wie die gegebenen Karte. Die Karte wird mit einer Kapazität von 1,5-fache der Anzahl der Zuordnungen in der gegebenen Karte oder 16 erstellt (je nachdem, was höher ist) und ein Standard-Lastfaktor (0,75) und concurrencyLevel (16).

Wenn lesen Sie die Quellcode wird deutlich, dass die maximale Anzahl der Segmente ist 2 ^ 16, die als ausreichend für jeden denkbaren Bedarf in der unmittelbaren Zukunft mehr sein sollte.

Sie haben vielleicht denken an bestimmten alternativen experimentellen Implementierungen gewesen, wie dieses :

  

Diese Klasse unterstützt einen festverdrahteten voreingestellten concurrency Pegel von 32. Dies ermöglicht ein Maximum von 32 Put und / oder Entfernen von Operationen gleichzeitig ablaufen.

, dass Hinweis im Allgemeinen andere Faktoren als Synchronisationseffizienz sind in der Regel die Engpaß, wenn mehr als 32 Threads versuchen, eine einzelne ConcurrentHashMap zu aktualisieren.

Andere Tipps

Der Standard nicht 32 ist, dann ist es 16. Und Sie können es außer Kraft setzen mit der Konstruktorargument concurrency level :

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor,
                         int concurrencyLevel)

so können Sie tun:

Map<String, String> map = new ConcurrentHashmap<String, String)(128, 0.75f, 64);

, um es die Standardeinstellungen zu ändern 64. sind (wie von Java 6u17):

  • initialCapacity: 16;
  • loadFactory: 0.75f;
  • concurrencyLevel. 16

Laut der Quelle von ConcurrentHashMap, erlaubt das Maximum 65536:

/**
 * The maximum number of segments to allow; used to bound
 * constructor arguments.
 */
static final int MAX_SEGMENTS = 1 << 16; // slightly conservative

public ConcurrentHashMap(int initialCapacity,
                         float loadFactor, int concurrencyLevel) {
    if (concurrencyLevel > MAX_SEGMENTS)
        concurrencyLevel = MAX_SEGMENTS;

Um alle Standard Gleichzeitigkeit Ebene von 16 Sie müssen 16 Kerne im selben Moment mit der Karte haben. Wenn Sie 32 Kerne haben nur die Karte 25% der Zeit dann nur 8 von 16 Segmenten verwenden, wird auf einmal verwendet werden.

Zusammenfassend müssen Sie viele Kerne alle haben die gleiche Karte verwenden und vieles andere nichts zu tun. Real-Programme in der Regel etwas tun andere als Zugang einer Karte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top