Java: Эффективное воздействие массовых одновременных вызовов метода

У меня есть основной вопрос, для которого я не могу найти ответ в сети. Предполагая, что у меня есть приложение, в котором несколько потоков совместно используют один экземпляр утилитарного метода, из которого запускаются потенциально длительные вычисления.

Возможно ли, что массовые совпадения вызовов метода повлияют на выполнение выполнения методов?

EDIT: "Влияние на производительность" я имею в виду: Значительное уменьшение скорости выполнения или даже выполнение метода блокировки.

3 ответа

Если метод не использует какой-либо ресурс. Тогда Не очень много (по крайней мере, не значительно, вы избежите утверждений). Вы потеряете производительность только в увеличении сбора мусора, использовании ЦП, создания объектов и т.д., Но потоки Thread и Cache Flushing будут меньше. Из ресурсов я имею в виду общие объекты, общий ввод-вывод. Но на практике, вероятно, у вас будет по крайней мере один общий ресурс.

Но если метод использует некоторые общие ресурсы, то да, этот метод может быть узким местом. Но есть много моделей, с помощью которых вы можете улучшить производительность. Например, если многие потоки только читают такой общий ресурс и только немного записывают/обновляют общий ресурс, тогда вы можете использовать ReadWriteLocks для защиты этой блокировки. Или вы можете использовать шаблон актера → http://www.slideshare.net/drorbr/the-actor-model-towards-better-concurrency

Также, пожалуйста, всегда старайтесь использовать параллельные структуры данных для совместного использования ваших общих ресурсов. например ConcurrentHashMap можно очень хорошо использовать для обмена информацией между потоками. Для проблем производителей-производителей среди Threads попробуйте использовать различные реализации BlockingQueue. Эти структуры данных также ухудшают производительность, но в любом случае вы должны платить цену за точность.

Также помните, пожалуйста, сосредоточьтесь сначала на разработке проблемы, а затем на производительности. если вы получите право на дизайн, у вас будет много лучших способов повысить производительность. Помните, что это общие проблемы параллелизма, и есть уже хорошие шаблоны, чтобы преодолеть многие короткие события.


Да, это возможно, например, если метод использует общий (или ограниченный) ресурс.

Такой ресурс может быть блокировкой, соединением с базой данных, (медленным) диском или даже оперативной памятью (как объем оперативной памяти, так и доступная пропускная способность памяти ограничены).


Производительность также может быть уменьшена за счет увеличения рабочей нагрузки для сборщика мусора, который должен очистить объекты, выделенные в методе. Хотя это происходит не только из-за самого параллелизма (но только из-за того, что метод вызывается очень часто), он будет скорее иметь влияние в среде, где время, доступное для GC, уже ограничено большим количеством активных потоки.

licensed under cc by-sa 3.0 with attribution.