Подтвердить что ты не робот

Реализация Java ConcurrentHashMap

Я просто смотрел исходный код Java ConcurrentHashMap и нашел эту строку кода:

/*
 * The maximum number of times to tryLock in a prescan before possibly blocking on acquire in   
 * preparation for a locked segment operation. On multiprocessors, using a bounded number of  
 * retries maintains cache acquired while locating nodes.
 */
static final int MAX_SCAN_RETRIES =
              Runtime.getRuntime().availableProcessors() > 1 ? 64 : 1

MAX_SCAN_RETRIES используется при поиске записей при фиксации. Мой вопрос: как определить число 64 для многопроцессорной машины? Кто-нибудь знает теорию за номером 64?

4b9b3361

Ответ 1

При работе с попытками блокировки нескольких процессоров есть баланс, который вы пытаетесь сделать, чтобы быстро получить блокировку (вращение) и позволить процессору переключиться на другой поток, чтобы избежать потери времени процессора на блокировке, которая не является скоро будет выпущен. Фактическое количество спинов, разрешенных для CPU для попытки блокировки, сильно зависит как от фактической скорости всей системы, так и от количества кода, который обычно выполняется в критическом разделе.

Эта проблема имеет глубокие корни в проблеме остановки и многие другие проблемы, связанные с проектированием ОС в системах SMP в отношении оптимизации concurrency. Такой выбор дизайна обычно разрешается с помощью метода проб и ошибок во многих приложениях; однако выбор 64 выглядит мне как произвольный вызов со стороны исполнителя (число - это два).

К сожалению, этот конкретный код является ошибкой и ограничивает. Багги в том, что документация для доступных процессоров гласит: "Это значение может меняться во время конкретного вызова виртуальной машины", следовательно, потенциально может затормозить затвор слишком много раз (если счетчик перемещается от > 1 до = 1) или слишком мало (в в случае с визой). Ограничение тем, что разработчику, который действительно нуждается в настройке concurrency в своем приложении, не имеет возможности сделать это, поскольку MAX_SCAN_RETRIES является окончательным (хотя некоторые трюки могут воспроизводиться с отражением).