Что происходит, когда вы вызываете статический метод в C #? - PullRequest
9 голосов
/ 22 декабря 2011

Когда вы создаете экземпляр класса, все переменные в этом экземпляре являются специфическими для этого экземпляра и уничтожаются, когда экземпляр выходит за рамки.Но как это работает в статическом методе?Предположим, что два человека вызывают System.Math.Abs ​​() в одно и то же время.Как среда выполнения различает двух абонентов?Это где поток вступает в силу?Для каждого звонящего автоматически создаются отдельные темы?

Ответы [ 3 ]

12 голосов
/ 22 декабря 2011

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

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

Но как это работает в статическом методе?

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

Предположим, что два человека одновременно вызывают System.Math.Abs ​​().

ОК.Как вы предлагаете, чтобы это произошло?

Как время выполнения различает двух вызывающих?Это где начинается многопоточность?

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

Автоматически ли создаются отдельные потоки для каждого вызывающего абонента?

Вопрос нене имеет никакого смысла.Как вы получили двух абонентов одновременно , если они не были уже в отдельных потоках?

10 голосов
/ 22 декабря 2011

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

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

Для простоты я закрашиваю блоки итераторов, захваченные переменные и т. Д.

6 голосов
/ 22 декабря 2011

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

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

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

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