2016-09-10 4 views
1

Ich habe mir schon seit einiger Zeit den Kopf um eine Frage gekratzt, ich habe mich umgesehen, bin aber gescheitert, die Antwort zu finden. Ich möchte wissen, was passieren wird, wenn die concurrencyLevel größer sein wird als die capacity der Karte.Was passiert, wenn die ConcurrencyLevel größer ist als die Kapazität einer ConcurrentHashMap?

Standardmäßig sind beide 16, was bedeutet, dass jeder Bucket eine Sperre hat. Und wenn die capacity wird 32 und concurrencyLevel 16, dass eine Sperre auf 2 Eimer gehalten wird. Aber was passiert, wenn concurrencyLevel 32 ist und capacity 16 ist?

Wird jeder Eimer von 2 Schlössern gehalten, was passiert dann, wenn die Verteilung von concurrencyLevel und capacity ungleichmäßig ist, wie 24 und 16, oder etwas?

+0

manchmal hatte ich wünsche SO ein Feature Menschen zu markieren, müssten Sie kennen die Antwort, so dass Sie sofort eine Antwort erhalten, eine Funktion, ähnlich wie Quoren aber mehr verfeinert, So wie ich die Leute markieren kann, die bereits in der Post kommentiert haben. – rd22

+0

Dafür gibt es Tags und @pings in Kommentaren. – EJP

+0

ja! aber kann ich jemanden in der SO-Community taggen, auch ohne dass sie die Frage kommentieren? @oleg wird das funktionieren? – rd22

Antwort

5

Nichts besonderes passiert. Haben Sie die Dokumentation von ConcurrentHashMap überprüft? Darin heißt es: "Aus Kompatibilitätsgründen mit früheren Versionen dieser Klasse können Konstruktoren optional einen erwarteten concurrencyLevel als zusätzlichen Hinweis für die interne Größenanpassung angeben." Dies ist ein Hinweis, keine Einschränkung. Außerdem unter concurrencyLevel: "die geschätzte Anzahl der gleichzeitig aktualisierenden Threads. Die Implementierung kann diesen Wert als Dimensionierungshinweis verwenden. "Hinweis:" kann ". Wenn also etwas passiert, wird die Größe anders. Könnte sein.

Wenn Sie weitere Details zur Implementierung wünschen, können Sie den Quellcode studieren. Es ist verfügbar. In Java 1.8 es die folgenden zwei Zeilen contanis:

if (initialCapacity < concurrencyLevel) // Use at least as many bins 
     initialCapacity = concurrencyLevel; // as estimated threads 
+0

Das macht Sinn, ich verifizierte es von der Quelle, aber ich arbeitete in Java 7 und es war nicht klar in Java 7, sie hatten zu viele interne Variablen verwendet. Passiert etwas ähnliches Java 7? – rd22

Verwandte Themen