2012-08-20 2 views
0

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

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

Когда я изменяю количество потоков от 5 до 300 (я выполняю их через ScheduledExecutorService), я не вижу разницы в общей пропускной способности системы.

Действительно ли выполняется оптимизация или что-то отличается от того, что я себе представляю?

+0

«JVM позволяет выделять только один экземпляр перечисления в памяти». Откуда у вас эта идея? – EJP

+0

Пункт 3 «Эффективная Ява» Джошуа Блоха. (У меня есть второе издание) – Luiz

+0

Вы имеете в виду «Enum»? – EJP

ответ

2

Не существует конфликта, если все методы выполняют доступ (то есть чтение) памяти. Если вы не изменяете значения и не сохраняете значения в экземплярах или статических переменных, ваши методы являются «потокобезопасными» без синхронизации.

Либо вы не указали свою проблему полностью, либо ее нет.

+0

Простите, может быть, я не был ясен. Я действительно обеспокоен тем, как ЦП получают доступ к этому конкретному месту памяти, на который назначен метод перечисления, а не как доступ к памяти метода перечисления, так или иначе все объекты, к которым относится метод перечисления, являются потокобезопасными. – Luiz

+0

ЦП получают доступ к памяти, загружая адрес памяти на адресную шину и ожидая появления значений (-ов), где бы они ни появлялись на этом конкретном ЦП. Threading используется для прерывания (одного) процессора, сохранения контекста и выполнения какой-либо другой части программы на некоторое время. Это немного сложнее, чем для многопроцессорных машин. Но вы ничего не сказали об этой памяти, кроме «доступа»; синхронизация не требуется для чтения памяти, и это обычно вызывает замедление в многопоточных приложениях, которые имеют проблемы. Поэтому я еще не знаю лучшего ответа. – arcy

+0

Нет проблем с доступом к количеству потоков или чтением единственного значения перечисления. –

1

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

0

Если доступ к памяти не читается, т. Е. Нить не обновляет значение переменной, пропускная способность остается неизменной. Если вы все еще верите в проблемы параллелизма, попробуйте JNI.

Смежные вопросы