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

что-то о static:

  • экземпляры статического метода класса share

аналогичные вопросы:

Я сбиваю с толку:

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

Ответ 1

  Я путаюсь с:

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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