Предвзятая блокировка в Java - PullRequest
26 голосов
/ 25 февраля 2012

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

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

Ответы [ 3 ]

35 голосов
/ 25 февраля 2012

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

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

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

5 голосов
/ 25 февраля 2012

Разве это не отвечает на ваши вопросы?

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

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

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

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

3 голосов
/ 10 октября 2014

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

Однако кажется, что смещенные блокировки java медленнее на процессорах nehalem компании Intel, чем обычные блокировки, и предположительно на двух поколениях процессоров начиная с 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) наличие аналогичных безопасных точек, которые являются вызовом возврата - и другой поток изменяет код до точки останова ...

...