Я смущен использованием статического метода в многопоточности java?

что-то о статическом:

  • экземпляры класса share static method

подобные вопросы:

Я сбит с толку:

  • статический метод имеет только один блок памяти?
  • Если я использую статический метод в многопоточности, это блок?

3 ответов


Я сбит с толку:

статический метод имеет только один блок памяти? если я использую статический метод в multithreading, он преградит?

на static ключевое слово в Java просто означает " без учета или знания какого-либо конкретного экземпляра объекта."

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

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

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

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

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


статический метод имеет только один блок памяти?

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

если я использую статический метод в многопоточности, это блок

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


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

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

посмотреть примеры классов со статическими методы, такие как Java.ленг.Математика. Его методы не имеют состояния, поэтому блокировка не требуется. Статические методы хороши для случаев, когда нет общего состояния. Они могут быть в порядке в случаях доступа или изменения общего состояния threadsafe, в зависимости от того, какой уровень параллелизма необходим и насколько эффективны доступные threadsafe вещи. (Следите за узкими местами.)

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