2016-09-10 3 views
1

Я уже некоторое время царапаю голову вокруг вопроса, я огляделся, но не смог найти ответ. Я хочу знать, что произойдет, если concurrencyLevel будет больше, чем capacity Карты.Что происходит, когда параметр concurrencyLevel больше, чем емкость ConcurrentHashMap?

По умолчанию оба значения равны 16, что означает, что каждое ведро будет иметь блокировку. И если capacity будет 32 и concurrencyLevel 16, то замок будет удерживаться на 2 ведрах. Но что происходит, когда concurrencyLevel - 32 и capacity - 16?

Будет ли каждое ведро удерживаться 2 замками, что произойдет, если распределение concurrencyLevel и capacity неровное, как 24 и 16, или что-то еще?

+0

порой я желаю SO имел возможность помечать людей, которых вы знаете, что есть ответ, так что вы получите немедленный ответ, функцию, аналогичную Quora, но более изысканный, как я могу отметить людей, которые уже прокомментировали это сообщение. – rd22

+0

Вот для чего нужны теги, и @pings в комментариях. – EJP

+0

да! но могу ли я пометить кого-нибудь в сообществе SO, даже если они не комментируют вопрос? @oleg будет работать? – rd22

ответ

5

Ничего особенного не происходит. Вы проверили документацию ConcurrentHashMap? В нем говорится: «Кроме того, для совместимости с предыдущими версиями этого класса конструкторы могут опционально указать ожидаемый concurrencyLevel в качестве дополнительного подсказки для внутреннего определения размера». Это намек, а не ограничение. Кроме того, на concurrencyLevel: «оценочное количество одновременных обновлений потоков. Реализация может использовать это значение в качестве подсказки для калибровки ». Примечание:« может ». Поэтому, если что-то происходит, размер становится другим. Может быть.

Если вы хотите получить подробную информацию о реализации, вы можете изучить исходный код. Это доступно. В Java 1.8 contanis следующие две строки:

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

Это имеет смысл, я проверил его от источника, но я работал в java 7, и в java 7 не было ясно, что они использовали слишком много внутренних переменных. Что-то подобное происходит в Java 7? – rd22