2016-09-13 10 views
1

Я читал этот вопрос Static method behavior in multi-threaded environment in java.
Но этот вопрос не ответил, что может Многопоточный работает тот же метод в то же время учитывая в процессоре среде многоядерного.
Если мой вопрос в заголовке «да», как именно мой компьютер реализует это? Поскольку существует только один статический метод, ожидающий вызова.
Сделайте два ядра, соответственно, скопируйте этот статический метод на свой ящик ядра и запустите их одновременно и соответственно?
Я не знаю, четко ли я выражаю свою точку зрения. Если нет, я более чем готов объяснить это. Спасибо.В среде многоядерного процессора может быть несколько потоков, работающих с одним и тем же статическим методом в одно и то же время

+0

многоячеечная машина или нет, это то же RAM. Ответ на ваш вопрос такой же, как тот, о котором вы говорите. –

ответ

8

Вся информация, необходимая для выполнения фрагмента кода независимо, хранится локально в потоке . Когда ядро ​​выполняет метод, он делает это в контексте потока. Поскольку фактический исполняемый код не может быть изменен (он не может быть записан), нет необходимости копировать его в любом месте: его можно просто разделить между потоками/ядрами.

Методы могут иметь локальные переменные. Они хранятся в стеке, который является свойством потока. Каждый поток имеет отдельный кусок памяти для своего стека, и поэтому каждое ядро ​​будет получать доступ к различной памяти для локальных переменных.

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

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

Ядро может копировать исполняемый код в локальный кеш для выполнения, но это делается по соображениям производительности, а не из-за каких-либо проблем с совместным использованием.

Быстрый ответ: да.

+0

Похоже, я неправильно понимаю, какие методы есть. Итак, когда поток создается, он сохраняет в себе весь контекст статического метода. Затем, когда этот поток выполняет этот метод, он просто запускает контекст, который уже был сохранен сам по себе ??? Это верно? –

+1

Да - поток содержит контекст; то есть, где вы находитесь в коде и значениях локальных переменных как в статических, так и в методах экземпляра. Все остальное находится в куче. Единственная разница между методами static и instance заключается в том, что метод экземпляра также может обращаться к членам объекта, тогда как статический метод не может. Это запутывает, поскольку методы экземпляров выглядят так, как будто они «существуют» для каждого объекта, но на самом деле единственное, что существует в объекте, это данные. Существует только одна копия кода. – rghome

1

Если вы говорите о многопоточности в одном процессе, то два потока будут запускать статический метод, основанный на приоритете потока. Но если вы говорите о Multi Processor Multi Threading enviorment, тогда Да, тот же статический или нестатический метод в одно и то же время может работать в среде многоядерного процессора. Потому что каждый процесс будет работать в разных условиях JVM.

1

Короткий ответ, да его возможно.

Каждый вызов метода получит свой собственный стек и может работать параллельно.

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

Подумайте об этом с точки зрения класса/объекта. Все объекты одного и того же класса имеют одну и ту же базу кода, но означает ли это, что два объекта нельзя создать одновременно?

Экземпляр относится к одному и тому же объекту, но все же отличается от другого экземпляра.

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

Я думаю, что ваше замешательство связано с тем, что метод является статическим (отсюда ваше предположение, только одна копия). Копия остается неизменной, не означает, что каждый раз, когда вызывается метод, инструкции должны быть скопированы. Дифференцируйте инструкцию и данные, которые помогут.