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

Смещенная блокировка в java

Я продолжаю читать о том, как смещенная блокировка, используя флаг -XX:+UseBiasedLocking, может улучшить производительность неконтролируемой синхронизации. Я не мог найти ссылку на то, что он делает и как это улучшает производительность.

Может кто-нибудь объяснить мне, что это такое или, может быть, указать мне на некоторые ссылки/ресурсы, которые объясняют?

4b9b3361

Ответ 1

По сути, если ваши объекты заблокированы только одним потоком, JVM может выполнить оптимизацию и "сместить" этот объект к этому потоку таким образом, чтобы последующие элементарные операции над объектом не требовали затрат на синхронизацию. Я предполагаю, что это, как правило, направлено на чрезмерно консервативный код, который выполняет блокировки на объектах, никогда не подвергая их другому потоку. Фактические накладные расходы на синхронизацию включаются только после того, как другой поток попытается получить блокировку объекта.

Он включен по умолчанию в Java 6.

-XX + UseBiasedLocking Включает технику для повышения производительности несанкционированной синхронизации. Объект "смещен" к потоку, который первым получает свой монитор через байт-код монитора или синхронизированный вызов метода; последующие операции, связанные с монитором, выполняемые этим потоком, на многопроцессорных компьютерах выполняются относительно быстрее. Некоторые приложения со значительными объемами неконтролируемой синхронизации могут достигать значительных ускорений с включенным этим флагом; в некоторых приложениях с определенными схемами блокировки могут наблюдаться замедления, хотя были предприняты попытки минимизировать негативное влияние.

Ответ 2

Не отвечает ли это на ваши вопросы?

http://www.oracle.com/technetwork/java/tuning-139912.html#section4.2.5

Включает технику для повышения производительности без проблем синхронизации. Объект "смещен" к нити, которая сначала приобретает свой монитор через байт-код монитора или синхронизированный вызов метода; последующие связанные с монитором операции, выполняемые эта резьба относительно много быстрее на многопроцессорных машинах. В некоторых приложениях со значительным количеством незащищенных синхронизация может достичь значительных ускорений с помощью этого флага включен; некоторые приложения с определенными шаблонами блокировки могут видеть замедления, хотя были предприняты попытки свести к минимуму отрицательный воздействие.

Хотя я думаю, что вы найдете его по умолчанию в 1.6. Используйте параметр диагностики PrintFlagsFinal, чтобы узнать, что представляют собой эффективные флаги. Убедитесь, что вы указываете -сервер, если вы изучаете серверное приложение, поскольку флаги могут отличаться:

http://www.jroller.com/ethdsy/entry/print_all_jvm_flags

Ответ 3

Я сам задавался вопросом о предвзятых замках.

Однако кажется, что смещенные на Java блокировки медленнее для процессоров Intel Nehalem, чем обычные блокировки, и, вероятно, на двух поколениях процессоров начиная с Nehalem. Смотрите http://mechanical-sympathy.blogspot.com/2011/11/java-lock-implementations.html и здесь http://www.azulsystems.com/blog/cliff/2011-11-16-a-short-conversation-on-biased-locking

Также больше информации здесь https://blogs.oracle.com/dave/entry/biased_locking_in_hotspot

Я надеялся, что есть какой-то относительно дешевый способ снять предвзятую блокировку на Intel, но я начинаю верить, что это невозможно. Статьи, которые я видел о том, как это делается, основаны либо на:

  1. использование ОС для остановки потока
  2. отправка сигнала, т.е. запуск кода в другом потоке
  3. наличие безопасных точек, которые гарантированно выполняются довольно часто в другом потоке, и ожидание выполнения одного из них (что делает java).
  4. наличие аналогичных безопасных точек, которые являются вызовом возврата - и другой поток изменяет код до точки останова...