Находятся синхронизированные методы медленнее в единственных потоковых приложениях?

Другой альтернативой является запуск вашего скрипта с #!/bin/bash -f в качестве первой строки, что позволит вам принимать буквенные строки в качестве аргументов (включая звездочку), и, таким образом, позволит вам запустить ./a.out 123 * с нужным вводом , но учтите, что bash -f полностью отключает расширения, и это может иметь неблагоприятные последствия в вашем скрипте в зависимости от того, что вы делаете.

11
задан Community 23 May 2017 в 11:54
поделиться

3 ответа

Да, однопоточные программы Java, использующие синхронизацию могут быть немного медленнее, чем без синхронизации. Для ранних выпусков Java синхронизация была дорогой. Однако для любого современного выпуска неконтролируемая синхронизация обходится довольно дешево. Я бы не стал беспокоиться об этом.

Обратите внимание, что в Java 6 есть, а в Java 7 должна быть хорошая оптимизация блокировки:

  • Укрупнение блокировки
  • Исключение блокировки
  • Адаптивная блокировка вращения
  • Смещенная блокировка

Для получения дополнительной информации см. Технический документ о производительности Java SE 6 . Также обратите внимание, что неконтролируемая синхронизация оказывается более дорогостоящей на многоядерных процессорах, чем на одноядерных процессорах, возможно, из-за требований модели памяти Java к синхронизации, вынуждающей кеши локального процессора совместно использоваться с другими процессорами, или из-за некоторого другого барьера памяти. Например, прочтите Действительно ли оптимизация потоков Java 6 работает? - Часть II . (Часть I не была такой проницательной, как Часть II.)

15
ответ дан 3 December 2019 в 05:58
поделиться

При использовании синхронизированных структур данных замедление не зависит от того, «сколько» блокируется. Активация или снятие блокировки выполняется медленно, поскольку обычно включает в себя что-то вроде системного вызова (переключение контекста происходит медленно на любой платформе). В среде JIT, такой как типичная JVM, теоретически можно было бы оптимизировать все вызовы блокировки / разблокировки, когда работает только один поток, но он должен быть должным образом недействительным при запуске другого потока.

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

0
ответ дан 3 December 2019 в 05:58
поделиться

Да. Они будут немного медленнее из-за дополнительных накладных расходов на поддержку блокировок.

5
ответ дан 3 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: